From c487cd11fd1731ddc35b12e848a0a511f1f8a5ba Mon Sep 17 00:00:00 2001 From: Weyert de Boer <7049+weyert@users.noreply.github.com> Date: Wed, 9 Apr 2025 01:10:33 +0100 Subject: [PATCH 01/55] feat(react): add FeatureFlag component Introduces the FeatureFlag component for React that allow using feature flags in a declarative manner Signed-off-by: Weyert de Boer <7049+weyert@users.noreply.github.com> Signed-off-by: Weyert de Boer --- .../react/src/declarative/FeatureFlag.tsx | 91 +++++++++++++++ packages/react/src/declarative/index.ts | 1 + packages/react/src/index.ts | 1 + packages/react/test/declarative.spec.tsx | 109 ++++++++++++++++++ 4 files changed, 202 insertions(+) create mode 100644 packages/react/src/declarative/FeatureFlag.tsx create mode 100644 packages/react/src/declarative/index.ts create mode 100644 packages/react/test/declarative.spec.tsx diff --git a/packages/react/src/declarative/FeatureFlag.tsx b/packages/react/src/declarative/FeatureFlag.tsx new file mode 100644 index 000000000..1777dbcca --- /dev/null +++ b/packages/react/src/declarative/FeatureFlag.tsx @@ -0,0 +1,91 @@ +import React from 'react'; +import { useFlag } from '../evaluation'; +import type { FlagQuery } from '../query'; + +/** + * Props for the Feature component that conditionally renders content based on feature flag state. + * @interface FeatureProps + */ +interface FeatureProps { + /** + * The key of the feature flag to evaluate. + */ + featureKey: string; + + /** + * Optional value to match against the feature flag value. + * If provided, the component will only render children when the flag value matches this value. + * If a boolean, it will check if the flag is enabled (true) or disabled (false). + * If a string, it will check if the flag variant equals this string. + */ + match?: string | boolean; + + /** + * Default value to use when the feature flag is not found. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + defaultValue: any; + + /** + * Content to render when the feature flag condition is met. + * Can be a React node or a function that receives flag query details and returns a React node. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + children: React.ReactNode | ((details: FlagQuery) => React.ReactNode); + + /** + * Optional content to render when the feature flag condition is not met. + */ + fallback?: React.ReactNode; + + /** + * If true, inverts the condition logic (renders children when condition is NOT met). + */ + negate?: boolean; +} + +/** + * FeatureFlag component that conditionally renders its children based on the evaluation of a feature flag. + * + * @param {FeatureProps} props The properties for the FeatureFlag component. + * @returns {React.ReactElement | null} The rendered component or null if the feature is not enabled. + */ +export function FeatureFlag({ + featureKey, + match, + negate = false, + defaultValue = true, + children, + fallback = null, +}: FeatureProps): React.ReactElement | null { + const details = useFlag(featureKey, defaultValue, { + updateOnContextChanged: true, + }); + + // If the flag evaluation failed, we render the fallback + if (details.reason === 'ERROR') { + return <>{fallback}; + } + + let isMatch = false; + if (typeof match === 'string') { + isMatch = details.variant === match; + } else if (typeof match !== 'undefined') { + isMatch = details.value === match; + } + + // If match is undefined, we assume the flag is enabled + if (match === void 0) { + isMatch = true; + } + + const shouldRender = negate ? !isMatch : isMatch; + + if (shouldRender) { + console.log('chop chop'); + const childNode: React.ReactNode = typeof children === 'function' ? children(details) : children; + return <>{childNode}; + } + + return <>{fallback}; +} diff --git a/packages/react/src/declarative/index.ts b/packages/react/src/declarative/index.ts new file mode 100644 index 000000000..5baeee7ca --- /dev/null +++ b/packages/react/src/declarative/index.ts @@ -0,0 +1 @@ +export * from './FeatureFlag'; diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index e08a7ae63..9859e26d4 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -1,3 +1,4 @@ +export * from './declarative'; export * from './evaluation'; export * from './query'; export * from './provider'; diff --git a/packages/react/test/declarative.spec.tsx b/packages/react/test/declarative.spec.tsx new file mode 100644 index 000000000..02d36b649 --- /dev/null +++ b/packages/react/test/declarative.spec.tsx @@ -0,0 +1,109 @@ +import React from 'react'; +import '@testing-library/jest-dom'; // see: https://testing-library.com/docs/react-testing-library/setup +import { render, screen } from '@testing-library/react'; +import { FeatureFlag } from '../src/declarative/FeatureFlag'; // Assuming Feature.tsx is in the same directory or adjust path +import { InMemoryProvider, OpenFeature, OpenFeatureProvider } from '../src'; + +describe('Feature Component', () => { + const EVALUATION = 'evaluation'; + const MISSING_FLAG_KEY = 'missing-flag'; + const BOOL_FLAG_KEY = 'boolean-flag'; + const BOOL_FLAG_NEGATE_KEY = 'boolean-flag-negate'; + const BOOL_FLAG_VARIANT = 'on'; + const BOOL_FLAG_VALUE = true; + const STRING_FLAG_KEY = 'string-flag'; + const STRING_FLAG_VARIANT = 'greeting'; + const STRING_FLAG_VALUE = 'hi'; + + const FLAG_CONFIG: ConstructorParameters[0] = { + [BOOL_FLAG_KEY]: { + disabled: false, + variants: { + [BOOL_FLAG_VARIANT]: BOOL_FLAG_VALUE, + off: false, + }, + defaultVariant: BOOL_FLAG_VARIANT, + }, + [BOOL_FLAG_NEGATE_KEY]: { + disabled: false, + variants: { + [BOOL_FLAG_VARIANT]: BOOL_FLAG_VALUE, + off: false, + }, + defaultVariant: 'off', + }, + [STRING_FLAG_KEY]: { + disabled: false, + variants: { + [STRING_FLAG_VARIANT]: STRING_FLAG_VALUE, + parting: 'bye', + }, + defaultVariant: STRING_FLAG_VARIANT, + } + }; + + const makeProvider = () => { + return new InMemoryProvider(FLAG_CONFIG); + }; + + OpenFeature.setProvider(EVALUATION, makeProvider()); + + const childText = 'Feature is active'; + const ChildComponent = () =>
{childText}
; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + describe('', () => { + it('should not show the feature component if the flag is not enabled', () => { + render( + + + + + , + ); + + expect(screen.queryByText(childText)).toBeInTheDocument(); + }); + + it('should fallback when provided', () => { + render( + + Fallback}> + + + , + ); + + expect(screen.queryByText('Fallback')).toBeInTheDocument(); + + screen.debug(); + }); + + it('should handle showing multivariate flags with bool match', () => { + render( + + + + + , + ); + + expect(screen.queryByText(childText)).toBeInTheDocument(); + }); + + it('should show the feature component if the flag is not enabled but negate is true', () => { + render( + + + + + , + ); + + expect(screen.queryByText(childText)).toBeInTheDocument(); + }); + }); +}); From 0213bed3223c7a9abb372c42f5b477ffd8c3fe02 Mon Sep 17 00:00:00 2001 From: Michael Beemer Date: Thu, 10 Apr 2025 14:06:19 +0200 Subject: [PATCH 02/55] 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 Co-authored-by: Todd Baert Signed-off-by: Weyert de Boer --- .../react/src/evaluation/use-feature-flag.ts | 25 +++-- packages/react/src/internal/context.ts | 6 +- packages/react/src/internal/errors.ts | 9 ++ .../hook-flag-query.ts | 0 packages/react/src/internal/suspense.ts | 67 ++++++++++---- packages/react/src/internal/use.ts | 53 +++++++++++ packages/react/src/provider/provider.tsx | 2 +- .../src/provider/use-open-feature-client.ts | 7 +- .../src/provider/use-open-feature-provider.ts | 21 +++++ .../src/provider/use-when-provider-ready.ts | 11 ++- packages/react/test/evaluation.spec.tsx | 91 +++++++++++++------ 11 files changed, 227 insertions(+), 65 deletions(-) create mode 100644 packages/react/src/internal/errors.ts rename packages/react/src/{evaluation => internal}/hook-flag-query.ts (100%) create mode 100644 packages/react/src/internal/use.ts create mode 100644 packages/react/src/provider/use-open-feature-provider.ts diff --git a/packages/react/src/evaluation/use-feature-flag.ts b/packages/react/src/evaluation/use-feature-flag.ts index 7d3bab251..c128dfaaf 100644 --- a/packages/react/src/evaluation/use-feature-flag.ts +++ b/packages/react/src/evaluation/use-feature-flag.ts @@ -5,18 +5,24 @@ import type { EventHandler, FlagEvaluationOptions, FlagValue, - JsonValue} from '@openfeature/web-sdk'; -import { - ProviderEvents, - ProviderStatus, + JsonValue, } from '@openfeature/web-sdk'; +import { ProviderEvents, ProviderStatus } from '@openfeature/web-sdk'; import { useEffect, useRef, useState } from 'react'; +import { + DEFAULT_OPTIONS, + isEqual, + normalizeOptions, + suspendUntilInitialized, + suspendUntilReconciled, + useProviderOptions, +} from '../internal'; import type { ReactFlagEvaluationNoSuspenseOptions, ReactFlagEvaluationOptions } from '../options'; -import { DEFAULT_OPTIONS, isEqual, normalizeOptions, suspendUntilReady, useProviderOptions } from '../internal'; import { useOpenFeatureClient } from '../provider/use-open-feature-client'; import { useOpenFeatureClientStatus } from '../provider/use-open-feature-client-status'; +import { useOpenFeatureProvider } from '../provider/use-open-feature-provider'; import type { FlagQuery } from '../query'; -import { HookFlagQuery } from './hook-flag-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). @@ -280,15 +286,16 @@ function attachHandlersAndResolve( const defaultedOptions = { ...DEFAULT_OPTIONS, ...useProviderOptions(), ...normalizeOptions(options) }; const client = useOpenFeatureClient(); const status = useOpenFeatureClientStatus(); + const provider = useOpenFeatureProvider(); + const controller = new AbortController(); - // suspense if (defaultedOptions.suspendUntilReady && status === ProviderStatus.NOT_READY) { - suspendUntilReady(client); + suspendUntilInitialized(provider, client); } if (defaultedOptions.suspendWhileReconciling && status === ProviderStatus.RECONCILING) { - suspendUntilReady(client); + suspendUntilReconciled(client); } const [evaluationDetails, setEvaluationDetails] = useState>( diff --git a/packages/react/src/internal/context.ts b/packages/react/src/internal/context.ts index 4b495bac3..3fc7d7707 100644 --- a/packages/react/src/internal/context.ts +++ b/packages/react/src/internal/context.ts @@ -5,7 +5,8 @@ import { normalizeOptions } from '.'; /** * The underlying React context. - * DO NOT EXPORT PUBLICLY + * + * **DO NOT EXPORT PUBLICLY** * @internal */ export const Context = React.createContext< @@ -14,7 +15,8 @@ export const Context = React.createContext< /** * 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. */ diff --git a/packages/react/src/internal/errors.ts b/packages/react/src/internal/errors.ts new file mode 100644 index 000000000..81a72de65 --- /dev/null +++ b/packages/react/src/internal/errors.ts @@ -0,0 +1,9 @@ +const context = 'Components using OpenFeature must be wrapped with an .'; +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'; + } +} \ No newline at end of file diff --git a/packages/react/src/evaluation/hook-flag-query.ts b/packages/react/src/internal/hook-flag-query.ts similarity index 100% rename from packages/react/src/evaluation/hook-flag-query.ts rename to packages/react/src/internal/hook-flag-query.ts diff --git a/packages/react/src/internal/suspense.ts b/packages/react/src/internal/suspense.ts index 72f4ca0d0..319a256e1 100644 --- a/packages/react/src/internal/suspense.ts +++ b/packages/react/src/internal/suspense.ts @@ -1,21 +1,56 @@ -import type { Client} from '@openfeature/web-sdk'; -import { ProviderEvents } from '@openfeature/web-sdk'; +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>(); /** * Suspends until the client is ready to evaluate feature flags. - * DO NOT EXPORT PUBLICLY - * @param {Client} client OpenFeature client + * + * **DO NOT EXPORT PUBLICLY** + * @internal + * @param {Provider} provider the provider to suspend for + * @param {Client} client the client to check for readiness */ -export function suspendUntilReady(client: Client): Promise { - 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); - }); +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(); + } } diff --git a/packages/react/src/internal/use.ts b/packages/react/src/internal/use.ts new file mode 100644 index 000000000..186c832b9 --- /dev/null +++ b/packages/react/src/internal/use.ts @@ -0,0 +1,53 @@ +/// +// 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 = + Promise & { + 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 + ((thenable: UsePromise): 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; + } + }); diff --git a/packages/react/src/provider/provider.tsx b/packages/react/src/provider/provider.tsx index 64da42fdb..35333db5f 100644 --- a/packages/react/src/provider/provider.tsx +++ b/packages/react/src/provider/provider.tsx @@ -31,7 +31,7 @@ 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); } diff --git a/packages/react/src/provider/use-open-feature-client.ts b/packages/react/src/provider/use-open-feature-client.ts index ecd776451..093fe1c5e 100644 --- a/packages/react/src/provider/use-open-feature-client.ts +++ b/packages/react/src/provider/use-open-feature-client.ts @@ -1,6 +1,7 @@ import React from 'react'; import { Context } from '../internal'; -import type { Client } from '@openfeature/web-sdk'; +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 . If you are seeing this in a test, see: https://openfeature.dev/docs/reference/technologies/client/web/react#testing', - ); + throw new MissingContextError('No OpenFeature client available'); } return client; diff --git a/packages/react/src/provider/use-open-feature-provider.ts b/packages/react/src/provider/use-open-feature-provider.ts new file mode 100644 index 000000000..f15d0321e --- /dev/null +++ b/packages/react/src/provider/use-open-feature-provider.ts @@ -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); +} diff --git a/packages/react/src/provider/use-when-provider-ready.ts b/packages/react/src/provider/use-when-provider-ready.ts index 4cb5d0f0f..f66b2606c 100644 --- a/packages/react/src/provider/use-when-provider-ready.ts +++ b/packages/react/src/provider/use-when-provider-ready.ts @@ -2,7 +2,8 @@ import { ProviderStatus } from '@openfeature/web-sdk'; import { useOpenFeatureClient } from './use-open-feature-client'; import { useOpenFeatureClientStatus } from './use-open-feature-client-status'; import type { ReactFlagEvaluationOptions } from '../options'; -import { DEFAULT_OPTIONS, useProviderOptions, normalizeOptions, suspendUntilReady } from '../internal'; +import { DEFAULT_OPTIONS, useProviderOptions, normalizeOptions, suspendUntilInitialized } from '../internal'; +import { useOpenFeatureProvider } from './use-open-feature-provider'; type Options = Pick; @@ -14,14 +15,14 @@ type Options = Pick; * @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; diff --git a/packages/react/test/evaluation.spec.tsx b/packages/react/test/evaluation.spec.tsx index 5c9108c5a..5b08b30f5 100644 --- a/packages/react/test/evaluation.spec.tsx +++ b/packages/react/test/evaluation.spec.tsx @@ -6,12 +6,7 @@ import '@testing-library/jest-dom'; // see: https://testing-library.com/docs/rea 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 type { EvaluationContext, EvaluationDetails, EventContext, Hook } from '../src/'; import { ErrorCode, InMemoryProvider, @@ -27,15 +22,18 @@ import { useObjectFlagValue, useStringFlagDetails, useStringFlagValue, - useSuspenseFlag + useSuspenseFlag, } from '../src/'; -import { HookFlagQuery } from '../src/evaluation/hook-flag-query'; +import { HookFlagQuery } from '../src/internal/hook-flag-query'; import { TestingProvider } from './test.utils'; // custom provider to have better control over the emitted events class CustomEventInMemoryProvider extends InMemoryProvider { - - putConfigurationWithCustomEvent(flagConfiguration: FlagConfiguration, event: ProviderEmittableEvents, eventContext: EventContext) { + 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); @@ -395,16 +393,19 @@ describe('evaluation', () => { 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', + 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 }, - // if the flagsChanged is empty, we know nothing has changed, so we don't bother diffing - }, ClientProviderEvents.ConfigurationChanged, { flagsChanged: [] }); - + ClientProviderEvents.ConfigurationChanged, + { flagsChanged: [] }, + ); }); expect(screen.queryByTestId('render-count')).toHaveTextContent('1'); @@ -420,16 +421,19 @@ describe('evaluation', () => { 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', + 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 }, - // if the flagsChanged is falsy, we don't know what flags changed - so we attempt to diff everything - }, ClientProviderEvents.ConfigurationChanged, { flagsChanged: undefined }); - + ClientProviderEvents.ConfigurationChanged, + { flagsChanged: undefined }, + ); }); expect(screen.queryByTestId('render-count')).toHaveTextContent('2'); @@ -573,10 +577,41 @@ describe('evaluation', () => { }, }; + afterEach(() => { + OpenFeature.clearProviders(); + }); + const suspendingProvider = () => { return new TestingProvider(CONFIG, DELAY); // delay init by 100ms }; + describe('when using the noop provider', () => { + function TestComponent() { + const { value } = useSuspenseFlag(SUSPENSE_FLAG_KEY, DEFAULT); + return ( + <> +
{value}
+ + ); + } + it('should fallback to the default value on the next rerender', async () => { + render( + + {FALLBACK}}> + + + , + ); + // 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); From 0f8e277992476e4c463e2cc862313269ec1a0ac8 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Thu, 10 Apr 2025 14:39:39 +0200 Subject: [PATCH 03/55] 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 Signed-off-by: Weyert de Boer --- jest.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/jest.config.ts b/jest.config.ts index 161e5d085..f37298f8c 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -161,6 +161,7 @@ export default { testMatch: ['/packages/nest/test/**/*.spec.ts'], moduleNameMapper: { '@openfeature/core': '/packages/shared/src', + '@openfeature/server-sdk': '/packages/server/src', }, transform: { '^.+\\.ts$': [ From daf458d18511f900adb5afc4d910227ab749c4c8 Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Thu, 10 Apr 2025 09:52:28 -0400 Subject: [PATCH 04/55] chore(main): release core 1.8.0 (#1155) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](https://github.com/open-feature/js-sdk/commit/6a224830fa4e62fc30a7802536f6f6fc3f772038)) --- 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: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/shared/CHANGELOG.md | 7 +++++++ packages/shared/package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 542144763..8458abd62 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -4,6 +4,6 @@ "packages/angular": "0.0.1-experimental", "packages/web": "1.4.1", "packages/server": "1.17.1", - "packages/shared": "1.7.2", + "packages/shared": "1.8.0", "packages/angular/projects/angular-sdk": "0.0.10" } diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index 5f8e726ff..1c5f9f6bb 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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](https://github.com/open-feature/js-sdk/commit/6a224830fa4e62fc30a7802536f6f6fc3f772038)) + ## [1.7.2](https://github.com/open-feature/js-sdk/compare/core-v1.7.1...core-v1.7.2) (2025-02-18) diff --git a/packages/shared/package.json b/packages/shared/package.json index 5d5580877..43416ee6c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/core", - "version": "1.7.2", + "version": "1.8.0", "description": "Shared OpenFeature JS components (server and web)", "main": "./dist/cjs/index.js", "files": [ From 1ada0969f778e849c00ad0c47922c716fa244059 Mon Sep 17 00:00:00 2001 From: Lukas Reining Date: Fri, 11 Apr 2025 12:02:02 +0200 Subject: [PATCH 05/55] feat(angular): add option for initial context injection Signed-off-by: Lukas Reining Signed-off-by: Weyert de Boer --- .../projects/angular-sdk/src/lib/open-feature.module.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/angular/projects/angular-sdk/src/lib/open-feature.module.ts b/packages/angular/projects/angular-sdk/src/lib/open-feature.module.ts index 6abc81d56..e667b6e8b 100644 --- a/packages/angular/projects/angular-sdk/src/lib/open-feature.module.ts +++ b/packages/angular/projects/angular-sdk/src/lib/open-feature.module.ts @@ -1,10 +1,13 @@ import { InjectionToken, ModuleWithProviders, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { OpenFeature, Provider } from '@openfeature/web-sdk'; +import { EvaluationContext, OpenFeature, Provider } from '@openfeature/web-sdk'; + +export type EvaluationContextFactory = () => EvaluationContext; export interface OpenFeatureConfig { provider: Provider; domainBoundProviders?: Record; + context?: EvaluationContext | EvaluationContextFactory; } export const OPEN_FEATURE_CONFIG_TOKEN = new InjectionToken('OPEN_FEATURE_CONFIG_TOKEN'); @@ -16,7 +19,9 @@ export const OPEN_FEATURE_CONFIG_TOKEN = new InjectionToken(' }) export class OpenFeatureModule { static forRoot(config: OpenFeatureConfig): ModuleWithProviders { - OpenFeature.setProvider(config.provider); + 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), From cd10e6f6257daa134ee0887d2cff694c7eebe135 Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Fri, 11 Apr 2025 06:08:35 -0400 Subject: [PATCH 06/55] chore(main): release angular-sdk 0.0.11 (#1167) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](https://github.com/open-feature/js-sdk/commit/aafdb4382f113f96a649f5fc0cecadb4178ada67)) --- 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 Co-authored-by: Lukas Reining Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/angular/projects/angular-sdk/CHANGELOG.md | 8 ++++++++ packages/angular/projects/angular-sdk/README.md | 4 ++-- packages/angular/projects/angular-sdk/package.json | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 8458abd62..d36a43710 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -5,5 +5,5 @@ "packages/web": "1.4.1", "packages/server": "1.17.1", "packages/shared": "1.8.0", - "packages/angular/projects/angular-sdk": "0.0.10" + "packages/angular/projects/angular-sdk": "0.0.11" } diff --git a/packages/angular/projects/angular-sdk/CHANGELOG.md b/packages/angular/projects/angular-sdk/CHANGELOG.md index 22528e550..d5abfad0e 100644 --- a/packages/angular/projects/angular-sdk/CHANGELOG.md +++ b/packages/angular/projects/angular-sdk/CHANGELOG.md @@ -1,6 +1,14 @@ # Changelog +## [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) diff --git a/packages/angular/projects/angular-sdk/README.md b/packages/angular/projects/angular-sdk/README.md index bb4270cd1..dd37e86ee 100644 --- a/packages/angular/projects/angular-sdk/README.md +++ b/packages/angular/projects/angular-sdk/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/angular/projects/angular-sdk/package.json b/packages/angular/projects/angular-sdk/package.json index 88fd60bf5..cb7c54318 100644 --- a/packages/angular/projects/angular-sdk/package.json +++ b/packages/angular/projects/angular-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/angular-sdk", - "version": "0.0.10", + "version": "0.0.11", "description": "OpenFeature Angular SDK", "repository": { "type": "git", From db70768a69196e94bc4d3b156f21600a434d28b7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 11 Apr 2025 12:20:57 +0200 Subject: [PATCH 07/55] chore(deps): update angular-eslint monorepo to v19 (major) (#1140) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
angular-eslint/angular-eslint (@​angular-eslint/builder) ### [`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 ([#​2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238)) ##### ❤️ Thank You - Dave [@​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 ([#​2120](https://redirect.github.com/angular-eslint/angular-eslint/pull/2120)) ##### ❤️ Thank You - Leosvel Pérez Espinosa [@​leosvelperez](https://redirect.github.com/leosvelperez) #### 18.4.3 (2024-11-29) ##### 🩹 Fixes - yarn pnp issues ([#​2143](https://redirect.github.com/angular-eslint/angular-eslint/pull/2143)) ##### ❤️ Thank You - James Henry [@​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 ([#​2068](https://redirect.github.com/angular-eslint/angular-eslint/pull/2068)) ##### 🩹 Fixes - update dependency eslint to v9.13.0, support noConfigLookup ([#​2045](https://redirect.github.com/angular-eslint/angular-eslint/pull/2045)) ##### ❤️ Thank You - James Henry [@​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
angular-eslint/angular-eslint (@​angular-eslint/eslint-plugin) ### [`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 ([#​2259](https://redirect.github.com/angular-eslint/angular-eslint/pull/2259)) ##### 🩹 Fixes - **eslint-plugin-template:** find inline templates on components in blocks ([#​2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238)) ##### ❤️ Thank You - Dave [@​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 ([#​2218](https://redirect.github.com/angular-eslint/angular-eslint/pull/2218)) - **eslint-plugin:** prefer-signals read-only suggestion is now a fix ([#​2175](https://redirect.github.com/angular-eslint/angular-eslint/pull/2175)) ##### 🩹 Fixes - **eslint-plugin:** \[no-input-prefix] false positive on input initializer value ([#​2184](https://redirect.github.com/angular-eslint/angular-eslint/pull/2184)) - **eslint-plugin:** \[prefer-signals] support linkedSignal ([#​2213](https://redirect.github.com/angular-eslint/angular-eslint/pull/2213)) ##### ❤️ Thank You - Cédric Exbrayat [@​cexbrayat](https://redirect.github.com/cexbrayat) - Dave [@​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 ([#​2172](https://redirect.github.com/angular-eslint/angular-eslint/pull/2172)) ##### ❤️ Thank You - James Henry [@​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 ([#​2150](https://redirect.github.com/angular-eslint/angular-eslint/pull/2150)) ##### ❤️ Thank You - Quentin Deroubaix [@​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 ([#​1872](https://redirect.github.com/angular-eslint/angular-eslint/pull/1872)) - ⚠️ **eslint-plugin:** remove deprecated no-host-metadata-property rule ([#​2113](https://redirect.github.com/angular-eslint/angular-eslint/pull/2113)) - ⚠️ **eslint-plugin:** remove deprecated sort-ngmodule-metadata-arrays rule ([#​2114](https://redirect.github.com/angular-eslint/angular-eslint/pull/2114)) - ⚠️ **eslint-plugin:** prefer-standalone recognizes that standalone is the default ([#​2096](https://redirect.github.com/angular-eslint/angular-eslint/pull/2096)) - ⚠️ **eslint-plugin:** remove deprecated prefer-standalone-component rule ([#​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 ([#​2113](https://redirect.github.com/angular-eslint/angular-eslint/pull/2113)) - ⚠️ **eslint-plugin:** remove deprecated sort-ngmodule-metadata-arrays rule ([#​2114](https://redirect.github.com/angular-eslint/angular-eslint/pull/2114)) - ⚠️ **eslint-plugin:** prefer-standalone recognizes that standalone is the default ([#​2096](https://redirect.github.com/angular-eslint/angular-eslint/pull/2096)) - ⚠️ **eslint-plugin:** remove deprecated prefer-standalone-component rule ([#​2112](https://redirect.github.com/angular-eslint/angular-eslint/pull/2112)) ##### ❤️ Thank You - Daniel Kimmich [@​json-derulo](https://redirect.github.com/json-derulo) - Dave [@​reduckted](https://redirect.github.com/reduckted) - James Henry [@​JamesHenry](https://redirect.github.com/JamesHenry) - JamesHenry [@​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 ([#​1965](https://redirect.github.com/angular-eslint/angular-eslint/pull/1965)) - **eslint-plugin:** handle `output()` and `input()` functions in various rules ([#​2098](https://redirect.github.com/angular-eslint/angular-eslint/pull/2098)) ##### ❤️ Thank You - Aleksandr Martirosyan - Dave [@​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
angular-eslint/angular-eslint (@​angular-eslint/eslint-plugin-template) ### [`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 [@​angular/compiler](https://redirect.github.com/angular/compiler) 19.2.3 and rename some AST nodes to match ([#​2320](https://redirect.github.com/angular-eslint/angular-eslint/pull/2320)) - **eslint-plugin-template:** add rule prefer-contextual-for-variables ([#​2311](https://redirect.github.com/angular-eslint/angular-eslint/pull/2311)) - **eslint-plugin-template:** \[button-has-type] add option to ignore missing type ([#​2326](https://redirect.github.com/angular-eslint/angular-eslint/pull/2326)) ##### 🩹 Fixes - **eslint-plugin-template:** \[attributes-order] treat inputs without square brackets as attributes ([#​2316](https://redirect.github.com/angular-eslint/angular-eslint/pull/2316)) - **eslint-plugin-template:** \[attributes-order] order i18n attributes ([#​2307](https://redirect.github.com/angular-eslint/angular-eslint/pull/2307)) - **eslint-plugin-template:** \[i18n] Avoid exception in i18n rule with allowMarkupInContent=false ([#​2327](https://redirect.github.com/angular-eslint/angular-eslint/pull/2327)) ##### ❤️ Thank You - Dave [@​reduckted](https://redirect.github.com/reduckted) - m-akinc [@​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 ([#​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 ([#​2273](https://redirect.github.com/angular-eslint/angular-eslint/pull/2273)) - **prefer-static-string-properties:** resolve bug with directives ([#​2271](https://redirect.github.com/angular-eslint/angular-eslint/pull/2271)) - **eslint-plugin-template:** find inline templates on components in blocks ([#​2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238)) - **eslint-plugin-template:** \[prefer-static-string-properties] do not check structural directives ([#​2253](https://redirect.github.com/angular-eslint/angular-eslint/pull/2253)) - **eslint-plugin-template:** \[prefer-self-closing-tags] allow nested ng-content ([#​2257](https://redirect.github.com/angular-eslint/angular-eslint/pull/2257)) - **eslint-plugin-template:** \[prefer-self-closing-tags] do not treat comments as whitespace ([#​2256](https://redirect.github.com/angular-eslint/angular-eslint/pull/2256)) ##### ❤️ Thank You - Dave [@​reduckted](https://redirect.github.com/reduckted) - Marie Briand [@​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 ([#​2228](https://redirect.github.com/angular-eslint/angular-eslint/pull/2228)) ##### 🩹 Fixes - **eslint-plugin-template:** \[attribute-order] check for ng-template within svg ([#​2223](https://redirect.github.com/angular-eslint/angular-eslint/pull/2223)) - **eslint-plugin-template:** \[prefer-self-closing-tags] do not remove HTML-encoded whitespace ([#​2229](https://redirect.github.com/angular-eslint/angular-eslint/pull/2229)) ##### ❤️ Thank You - Dave [@​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 ([#​2088](https://redirect.github.com/angular-eslint/angular-eslint/pull/2088)) ##### ❤️ Thank You - Joan Llenas [@​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 ([#​2046](https://redirect.github.com/angular-eslint/angular-eslint/pull/2046)) - update dependency aria-query to v5.3.2 ([#​2053](https://redirect.github.com/angular-eslint/angular-eslint/pull/2053)) - update dependency aria-query to v5.3.1 ([#​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
angular-eslint/angular-eslint (@​angular-eslint/schematics) ### [`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 ([#​2331](https://redirect.github.com/angular-eslint/angular-eslint/pull/2331)) - update typescript-eslint packages to v8.27.0 ([#​2328](https://redirect.github.com/angular-eslint/angular-eslint/pull/2328)) - update typescript-eslint packages to v8.26.1 ([#​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 ([#​2294](https://redirect.github.com/angular-eslint/angular-eslint/pull/2294)) - update typescript-eslint packages to v8.26.0 ([#​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 ([#​2263](https://redirect.github.com/angular-eslint/angular-eslint/pull/2263)) - update dependency eslint to v9.21.0 ([#​2243](https://redirect.github.com/angular-eslint/angular-eslint/pull/2243)) - **eslint-plugin-template:** find inline templates on components in blocks ([#​2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238)) - update typescript-eslint packages to v8.24.0 ([#​2240](https://redirect.github.com/angular-eslint/angular-eslint/pull/2240)) ##### ❤️ Thank You - Dave [@​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 ([#​2217](https://redirect.github.com/angular-eslint/angular-eslint/pull/2217)) - update typescript-eslint packages to v8.23.0 ([#​2212](https://redirect.github.com/angular-eslint/angular-eslint/pull/2212)) - update dependency semver to v7.7.1 ([#​2225](https://redirect.github.com/angular-eslint/angular-eslint/pull/2225)) - update typescript-eslint packages to v8.20.0 ([#​2185](https://redirect.github.com/angular-eslint/angular-eslint/pull/2185)) - update dependency eslint to v9.18.0 ([#​2181](https://redirect.github.com/angular-eslint/angular-eslint/pull/2181)) - update dependency ignore to v7 ([#​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 ([#​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 ([#​2153](https://redirect.github.com/angular-eslint/angular-eslint/pull/2153)) - update dependency eslint to v9.16.0 ([#​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 ([#​2120](https://redirect.github.com/angular-eslint/angular-eslint/pull/2120)) ##### ❤️ Thank You - JamesHenry [@​JamesHenry](https://redirect.github.com/JamesHenry) - Leosvel Pérez Espinosa [@​leosvelperez](https://redirect.github.com/leosvelperez) #### 18.4.3 (2024-11-29) ##### 🩹 Fixes - update typescript-eslint packages to v8.16.0 ([#​2135](https://redirect.github.com/angular-eslint/angular-eslint/pull/2135)) - yarn pnp issues ([#​2143](https://redirect.github.com/angular-eslint/angular-eslint/pull/2143)) ##### ❤️ Thank You - James Henry [@​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 ([#​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 ([#​2068](https://redirect.github.com/angular-eslint/angular-eslint/pull/2068)) ##### 🩹 Fixes - update dependency eslint to v9.13.0, support noConfigLookup ([#​2045](https://redirect.github.com/angular-eslint/angular-eslint/pull/2045)) - update typescript-eslint packages to v8.10.0 ([#​2046](https://redirect.github.com/angular-eslint/angular-eslint/pull/2046)) - update typescript-eslint packages to v8.5.0 ([#​2020](https://redirect.github.com/angular-eslint/angular-eslint/pull/2020)) ##### ❤️ Thank You - James Henry [@​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.
angular-eslint/angular-eslint (@​angular-eslint/template-parser) ### [`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 [@​angular/compiler](https://redirect.github.com/angular/compiler) 19.2.3 and rename some AST nodes to match ([#​2320](https://redirect.github.com/angular-eslint/angular-eslint/pull/2320)) - **template-parser:** visit [@​let](https://redirect.github.com/let) child nodes ([#​2312](https://redirect.github.com/angular-eslint/angular-eslint/pull/2312)) ##### ❤️ Thank You - Dave [@​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 ([#​2238](https://redirect.github.com/angular-eslint/angular-eslint/pull/2238)) ##### ❤️ Thank You - Dave [@​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 ([#​2031](https://redirect.github.com/angular-eslint/angular-eslint/pull/2031)) ##### ❤️ Thank You - Matt Lewis [@​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.
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 371 ++++++++++++++++++++++++++++------ packages/angular/package.json | 10 +- 2 files changed, 314 insertions(+), 67 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4d0ea464..c88be9336 100644 --- a/package-lock.json +++ b/package-lock.json @@ -79,12 +79,13 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1802.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1802.10.tgz", - "integrity": "sha512-/xudcHK2s4J/GcL6qyobmGaWMHQcYLSMqCaWMT+nK6I6tu9VEAj/p3R83Tzx8B/eKi31Pz499uHw9pmqdtbafg==", + "version": "0.1902.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1902.7.tgz", + "integrity": "sha512-XPKbesrGJ3qOHLcwb3y8X14NlBIwxnh9OvsfyqgBujByJq0LIg4CaU/GrX0Lo4RmX3UQBli668TjFgmIkMTL7Q==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "18.2.10", + "@angular-devkit/core": "19.2.7", "rxjs": "7.8.1" }, "engines": { @@ -93,11 +94,12 @@ "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/core": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.2.10.tgz", - "integrity": "sha512-LFqiNdraBujg8e1lhuB0bkFVAoIbVbeXXwfoeROKH60OPbP8tHdgV6sFTqU7UGBKA+b+bYye70KFTG2Ys8QzKQ==", + "node_modules/@angular-devkit/architect/node_modules/@angular-devkit/core": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.7.tgz", + "integrity": "sha512-WeX/7HuNooJ4UhvVdremj6it0cX3nreG0/5r3QfrQd5Tz3sCHnh/lO5TW31gHtSqVgPjBGmzSzsyZ1Mi0lI7FA==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", @@ -112,7 +114,7 @@ "yarn": ">= 1.13.0" }, "peerDependencies": { - "chokidar": "^3.5.2" + "chokidar": "^4.0.0" }, "peerDependenciesMeta": { "chokidar": { @@ -120,15 +122,50 @@ } } }, + "node_modules/@angular-devkit/architect/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/architect/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular-devkit/schematics": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.2.10.tgz", - "integrity": "sha512-EIm/yCYg3ZYPsPYJxXRX5F6PofJCbNQ5rZEuQEY09vy+ZRTqGezH0qoUP5WxlYeJrjiRLYqADI9WtVNzDyaD4w==", + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.7.tgz", + "integrity": "sha512-kE9W1MqfasumAYVD8egMHefyxmA93KfBYrWqcepZaFPQTPwg1AGTlID7YLHToLQquw4Iqen6Xv8Bzfv05IZ+tw==", "dev": true, + "license": "MIT", "dependencies": { - "@angular-devkit/core": "18.2.10", + "@angular-devkit/core": "19.2.7", "jsonc-parser": "3.3.1", - "magic-string": "0.30.11", + "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" }, @@ -138,37 +175,171 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.7.tgz", + "integrity": "sha512-WeX/7HuNooJ4UhvVdremj6it0cX3nreG0/5r3QfrQd5Tz3sCHnh/lO5TW31gHtSqVgPjBGmzSzsyZ1Mi0lI7FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular-eslint/builder": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-18.4.3.tgz", - "integrity": "sha512-NzmrXlr7GFE+cjwipY/CxBscZXNqnuK0us1mO6Z2T6MeH6m+rRcdlY/rZyKoRniyNNvuzl6vpEsfMIMmnfebrA==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.3.0.tgz", + "integrity": "sha512-j9xNrzZJq29ONSG6EaeQHve0Squkm6u6Dm8fZgWP7crTFOrtLXn7Wxgxuyl9eddpbWY1Ov1gjFuwBVnxIdyAqg==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/architect": ">= 0.1800.0 < 0.1900.0", - "@angular-devkit/core": ">= 18.0.0 < 19.0.0" + "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", + "@angular-devkit/core": ">= 19.0.0 < 20.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, + "node_modules/@angular-eslint/builder/node_modules/@angular-devkit/core": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.7.tgz", + "integrity": "sha512-WeX/7HuNooJ4UhvVdremj6it0cX3nreG0/5r3QfrQd5Tz3sCHnh/lO5TW31gHtSqVgPjBGmzSzsyZ1Mi0lI7FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/builder/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/builder/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-18.4.3.tgz", - "integrity": "sha512-zdrA8mR98X+U4YgHzUKmivRU+PxzwOL/j8G7eTOvBuq8GPzsP+hvak+tyxlgeGm9HsvpFj9ERHLtJ0xDUPs8fg==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.3.0.tgz", + "integrity": "sha512-63Zci4pvnUR1iSkikFlNbShF1tO5HOarYd8fvNfmOZwFfZ/1T3j3bCy9YbE+aM5SYrWqPaPP/OcwZ3wJ8WNvqA==", "dev": true, "license": "MIT" }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-18.4.3.tgz", - "integrity": "sha512-AyJbupiwTBR81P6T59v+aULEnPpZBCBxL2S5QFWfAhNCwWhcof4GihvdK2Z87yhvzDGeAzUFSWl/beJfeFa+PA==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-19.3.0.tgz", + "integrity": "sha512-nBLslLI20KnVbqlfNW7GcnI9R6cYCvRGjOE2QYhzxM316ciAQ62tvQuXP9ZVnRBLSKDAVnMeC0eTq9O4ysrxrQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", - "@angular-eslint/utils": "18.4.3" + "@angular-eslint/bundled-angular-compiler": "19.3.0", + "@angular-eslint/utils": "19.3.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -177,14 +348,14 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-18.4.3.tgz", - "integrity": "sha512-ijGlX2N01ayMXTpeQivOA31AszO8OEbu9ZQUCxnu9AyMMhxyi2q50bujRChAvN9YXQfdQtbxuajxV6+aiWb5BQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-19.3.0.tgz", + "integrity": "sha512-WyouppTpOYut+wvv13wlqqZ8EHoDrCZxNfGKuEUYK1BPmQlTB8EIZfQH4iR1rFVS28Rw+XRIiXo1x3oC0SOfnA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", - "@angular-eslint/utils": "18.4.3", + "@angular-eslint/bundled-angular-compiler": "19.3.0", + "@angular-eslint/utils": "19.3.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, @@ -206,39 +377,114 @@ } }, "node_modules/@angular-eslint/schematics": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-18.4.3.tgz", - "integrity": "sha512-D5maKn5e6n58+8n7jLFLD4g+RGPOPeDSsvPc1sqial5tEKLxAJQJS9WZ28oef3bhkob6C60D+1H0mMmEEVvyVA==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-19.3.0.tgz", + "integrity": "sha512-Wl5sFQ4t84LUb8mJ2iVfhYFhtF55IugXu7rRhPHtgIu9Ty5s1v3HGUx4LKv51m2kWhPPeFOTmjeBv1APzFlmnQ==", "dev": true, "license": "MIT", "dependencies": { - "@angular-devkit/core": ">= 18.0.0 < 19.0.0", - "@angular-devkit/schematics": ">= 18.0.0 < 19.0.0", - "@angular-eslint/eslint-plugin": "18.4.3", - "@angular-eslint/eslint-plugin-template": "18.4.3", - "ignore": "6.0.2", - "semver": "7.6.3", + "@angular-devkit/core": ">= 19.0.0 < 20.0.0", + "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", + "@angular-eslint/eslint-plugin": "19.3.0", + "@angular-eslint/eslint-plugin-template": "19.3.0", + "ignore": "7.0.3", + "semver": "7.7.1", "strip-json-comments": "3.1.1" } }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/core": { + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.7.tgz", + "integrity": "sha512-WeX/7HuNooJ4UhvVdremj6it0cX3nreG0/5r3QfrQd5Tz3sCHnh/lO5TW31gHtSqVgPjBGmzSzsyZ1Mi0lI7FA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.2", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/schematics/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@angular-eslint/schematics/node_modules/ignore": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", - "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", + "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, + "node_modules/@angular-eslint/schematics/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@angular-eslint/template-parser": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-18.4.3.tgz", - "integrity": "sha512-JZMPtEB8yNip3kg4WDEWQyObSo2Hwf+opq2ElYuwe85GQkGhfJSJ2CQYo4FSwd+c5MUQAqESNRg9QqGYauDsiw==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-19.3.0.tgz", + "integrity": "sha512-VxMNgsHXMWbbmZeBuBX5i8pzsSSEaoACVpaE+j8Muk60Am4Mxc0PytJm4n3znBSvI3B7Kq2+vStSRYPkOER4lA==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3", + "@angular-eslint/bundled-angular-compiler": "19.3.0", "eslint-scope": "^8.0.2" }, "peerDependencies": { @@ -247,9 +493,9 @@ } }, "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", - "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -264,13 +510,13 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "18.4.3", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-18.4.3.tgz", - "integrity": "sha512-w0bJ9+ELAEiPBSTPPm9bvDngfu1d8JbzUhvs2vU+z7sIz/HMwUZT5S4naypj2kNN0gZYGYrW0lt+HIbW87zTAQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-19.3.0.tgz", + "integrity": "sha512-ovvbQh96FIJfepHqLCMdKFkPXr3EbcvYc9kMj9hZyIxs/9/VxwPH7x25mMs4VsL6rXVgH2FgG5kR38UZlcTNNw==", "dev": true, "license": "MIT", "dependencies": { - "@angular-eslint/bundled-angular-compiler": "18.4.3" + "@angular-eslint/bundled-angular-compiler": "19.3.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", @@ -19761,11 +20007,11 @@ "version": "0.0.0", "devDependencies": { "@angular-devkit/build-angular": "^19.0.0", - "@angular-eslint/builder": "18.4.3", - "@angular-eslint/eslint-plugin": "18.4.3", - "@angular-eslint/eslint-plugin-template": "18.4.3", - "@angular-eslint/schematics": "18.4.3", - "@angular-eslint/template-parser": "18.4.3", + "@angular-eslint/builder": "19.3.0", + "@angular-eslint/eslint-plugin": "19.3.0", + "@angular-eslint/eslint-plugin-template": "19.3.0", + "@angular-eslint/schematics": "19.3.0", + "@angular-eslint/template-parser": "19.3.0", "@angular/animations": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/common": "^19.0.0", @@ -23337,6 +23583,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23738,7 +23985,7 @@ }, "packages/angular/projects/angular-sdk": { "name": "@openfeature/angular-sdk", - "version": "0.0.10", + "version": "0.0.11", "dependencies": { "tslib": "^2.3.0" }, @@ -23804,7 +24051,7 @@ }, "packages/shared": { "name": "@openfeature/core", - "version": "1.7.2", + "version": "1.8.0", "license": "Apache-2.0", "devDependencies": {} }, diff --git a/packages/angular/package.json b/packages/angular/package.json index 345666e13..66c36a164 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -15,11 +15,11 @@ "private": true, "devDependencies": { "@angular-devkit/build-angular": "^19.0.0", - "@angular-eslint/builder": "18.4.3", - "@angular-eslint/eslint-plugin": "18.4.3", - "@angular-eslint/eslint-plugin-template": "18.4.3", - "@angular-eslint/schematics": "18.4.3", - "@angular-eslint/template-parser": "18.4.3", + "@angular-eslint/builder": "19.3.0", + "@angular-eslint/eslint-plugin": "19.3.0", + "@angular-eslint/eslint-plugin-template": "19.3.0", + "@angular-eslint/schematics": "19.3.0", + "@angular-eslint/template-parser": "19.3.0", "@angular/animations": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/common": "^19.0.0", From 04b76e29df5ed5c94a2318626f26460c044e9fce Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 11 Apr 2025 12:21:28 +0200 Subject: [PATCH 08/55] chore(deps): update dependency esbuild to ^0.25.0 [security] (#1145) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. https://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/pkg/api/serve_other.go#L121 https://github.com/evanw/esbuild/blob/df815ac27b84f8b34374c9182a93c94718f8a630/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
evanw/esbuild (esbuild) ### [`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 [@​sapphi-red](https://redirect.github.com/sapphi-red) for reporting this issue. - Delete output files when a build fails in watch mode ([#​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 ([#​3620](https://redirect.github.com/evanw/esbuild/issues/3620), [#​3877](https://redirect.github.com/evanw/esbuild/issues/3877), [#​3933](https://redirect.github.com/evanw/esbuild/issues/3933), [#​3997](https://redirect.github.com/evanw/esbuild/issues/3997), [#​4005](https://redirect.github.com/evanw/esbuild/issues/4005), [#​4037](https://redirect.github.com/evanw/esbuild/pull/4037), [#​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 [@​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 [@​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 [@​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:#​00f}} /* New output (with --minify) */ .a{.b{color:red}:where(& .b){color:#​00f}} ``` - Fix some correctness issues with source maps ([#​1745](https://redirect.github.com/evanw/esbuild/issues/1745), [#​3183](https://redirect.github.com/evanw/esbuild/issues/3183), [#​3613](https://redirect.github.com/evanw/esbuild/issues/3613), [#​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` ([#​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 ([#​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 ([#​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 ([#​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 ([#​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` ([#​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 ([#​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 `/* @​__KEY__ */` for string literals derived from property names ([#​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 `/* @​__KEY__ */` comment before the string makes it behave like a property name. So `obj.get(/* @​__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 `/* @​__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 `/* @​__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 ([#​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 ([#​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 ([#​4056](https://redirect.github.com/evanw/esbuild/issues/4056), [#​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 [@​MikeWillCook](https://redirect.github.com/MikeWillCook). - Allow passing a port of 0 to the development server ([#​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` ([#​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/
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 208 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 105 insertions(+), 105 deletions(-) diff --git a/package-lock.json b/package-lock.json index c88be9336..6b7dc899a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,7 @@ "@types/node": "^20.11.16", "@types/react": "^18.2.55", "@types/uuid": "^10.0.0", - "esbuild": "^0.24.0", + "esbuild": "^0.25.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-alias": "^1.1.2", @@ -2445,9 +2445,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", "cpu": [ "ppc64" ], @@ -2462,9 +2462,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", "cpu": [ "arm" ], @@ -2479,9 +2479,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", "cpu": [ "arm64" ], @@ -2496,9 +2496,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", "cpu": [ "x64" ], @@ -2513,9 +2513,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", "cpu": [ "arm64" ], @@ -2530,9 +2530,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", "cpu": [ "x64" ], @@ -2547,9 +2547,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", "cpu": [ "arm64" ], @@ -2564,9 +2564,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", "cpu": [ "x64" ], @@ -2581,9 +2581,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", "cpu": [ "arm" ], @@ -2598,9 +2598,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", "cpu": [ "arm64" ], @@ -2615,9 +2615,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", "cpu": [ "ia32" ], @@ -2632,9 +2632,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", "cpu": [ "loong64" ], @@ -2649,9 +2649,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", "cpu": [ "mips64el" ], @@ -2666,9 +2666,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", "cpu": [ "ppc64" ], @@ -2683,9 +2683,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", "cpu": [ "riscv64" ], @@ -2700,9 +2700,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", "cpu": [ "s390x" ], @@ -2717,9 +2717,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", "cpu": [ "x64" ], @@ -2734,9 +2734,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", "cpu": [ "arm64" ], @@ -2751,9 +2751,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", "cpu": [ "x64" ], @@ -2768,9 +2768,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", "cpu": [ "arm64" ], @@ -2785,9 +2785,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", "cpu": [ "x64" ], @@ -2802,9 +2802,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", "cpu": [ "x64" ], @@ -2819,9 +2819,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", "cpu": [ "arm64" ], @@ -2836,9 +2836,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", "cpu": [ "ia32" ], @@ -2853,9 +2853,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", "cpu": [ "x64" ], @@ -9281,9 +9281,9 @@ } }, "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -9294,31 +9294,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" } }, "node_modules/esbuild-wasm": { diff --git a/package.json b/package.json index 9456a0fb4..3104c1b41 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@types/node": "^20.11.16", "@types/react": "^18.2.55", "@types/uuid": "^10.0.0", - "esbuild": "^0.24.0", + "esbuild": "^0.25.0", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-import-resolver-alias": "^1.1.2", From d48c683306e2a6a60e4fea40fb429fc3420d4a52 Mon Sep 17 00:00:00 2001 From: Lukas Reining Date: Fri, 11 Apr 2025 13:56:24 +0200 Subject: [PATCH 09/55] feat(angular): add docs for setting evaluation context in angular (#1170) Adds docs for setting evaluation context in angular Signed-off-by: Lukas Reining Signed-off-by: Weyert de Boer --- .../angular/projects/angular-sdk/README.md | 92 +++++++++++++++---- 1 file changed, 75 insertions(+), 17 deletions(-) diff --git a/packages/angular/projects/angular-sdk/README.md b/packages/angular/projects/angular-sdk/README.md index dd37e86ee..5df5ab617 100644 --- a/packages/angular/projects/angular-sdk/README.md +++ b/packages/angular/projects/angular-sdk/README.md @@ -44,21 +44,22 @@ In addition to the features provided by the [web sdk](https://openfeature.dev/do - [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) + - [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) @@ -156,7 +157,7 @@ This parameter is optional, if omitted, the `thenTemplate` will always be render 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. +automatic re-rendering on flag value or contex 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. @@ -281,6 +282,63 @@ This can be used to just render the flag value or details without conditional re ``` +##### 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()` + +Here’s 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? @@ -291,4 +349,4 @@ Avoid importing anything from `@openfeature/web-sdk` or `@openfeature/core`. ## Resources - - [Example repo](https://github.com/open-feature/angular-test-app) +- [Example repo](https://github.com/open-feature/angular-test-app) From d403faea812ba157e4be03911b826c8343ac8835 Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Fri, 11 Apr 2025 08:04:30 -0400 Subject: [PATCH 10/55] chore(main): release angular-sdk 0.0.12 (#1171) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](https://github.com/open-feature/js-sdk/commit/24f1b230bf1d57971a336ac21b9ee46e8baf0cab)) ### 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 Co-authored-by: Lukas Reining Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/angular/projects/angular-sdk/CHANGELOG.md | 8 ++++++++ packages/angular/projects/angular-sdk/README.md | 4 ++-- packages/angular/projects/angular-sdk/package.json | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index d36a43710..4fb5e25df 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -5,5 +5,5 @@ "packages/web": "1.4.1", "packages/server": "1.17.1", "packages/shared": "1.8.0", - "packages/angular/projects/angular-sdk": "0.0.11" + "packages/angular/projects/angular-sdk": "0.0.12" } diff --git a/packages/angular/projects/angular-sdk/CHANGELOG.md b/packages/angular/projects/angular-sdk/CHANGELOG.md index d5abfad0e..dccda7489 100644 --- a/packages/angular/projects/angular-sdk/CHANGELOG.md +++ b/packages/angular/projects/angular-sdk/CHANGELOG.md @@ -1,6 +1,14 @@ # Changelog +## [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) diff --git a/packages/angular/projects/angular-sdk/README.md b/packages/angular/projects/angular-sdk/README.md index 5df5ab617..a79b7efce 100644 --- a/packages/angular/projects/angular-sdk/README.md +++ b/packages/angular/projects/angular-sdk/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/angular/projects/angular-sdk/package.json b/packages/angular/projects/angular-sdk/package.json index cb7c54318..f874abe88 100644 --- a/packages/angular/projects/angular-sdk/package.json +++ b/packages/angular/projects/angular-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/angular-sdk", - "version": "0.0.11", + "version": "0.0.12", "description": "OpenFeature Angular SDK", "repository": { "type": "git", From 20978c1dd9c830976332f724610f103e806c801b Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Fri, 11 Apr 2025 08:17:48 -0400 Subject: [PATCH 11/55] chore(main): release nestjs-sdk 0.2.3 (#1144) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](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 --- 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: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/nest/CHANGELOG.md | 14 ++++++++++++++ packages/nest/README.md | 4 ++-- packages/nest/package.json | 4 ++-- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 4fb5e25df..d78bfd32a 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "packages/nest": "0.2.2", + "packages/nest": "0.2.3", "packages/react": "0.4.11", "packages/angular": "0.0.1-experimental", "packages/web": "1.4.1", diff --git a/packages/nest/CHANGELOG.md b/packages/nest/CHANGELOG.md index fba3e44e8..8ba7a7d54 100644 --- a/packages/nest/CHANGELOG.md +++ b/packages/nest/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## [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) diff --git a/packages/nest/README.md b/packages/nest/README.md index 997444f0b..67a412da9 100644 --- a/packages/nest/README.md +++ b/packages/nest/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/nest/package.json b/packages/nest/package.json index 579191cf0..558996ef4 100644 --- a/packages/nest/package.json +++ b/packages/nest/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/nestjs-sdk", - "version": "0.2.2", + "version": "0.2.3", "description": "OpenFeature Nest.js SDK", "main": "./dist/cjs/index.js", "files": [ @@ -57,7 +57,7 @@ "@nestjs/platform-express": "^10.3.6", "@nestjs/testing": "^10.3.6", "@openfeature/core": "*", - "@openfeature/server-sdk": "*", + "@openfeature/server-sdk": "1.18.0", "@types/supertest": "^6.0.0", "supertest": "^7.0.0" } From dc79d47b3d7d37c58715b7030d9e916e76ff36cc Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Fri, 11 Apr 2025 08:30:17 -0400 Subject: [PATCH 12/55] chore(main): release server-sdk 1.18.0 (#1153) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](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)) --- 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 Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/server/CHANGELOG.md | 8 ++++++++ packages/server/README.md | 4 ++-- packages/server/package.json | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index d78bfd32a..1d9c72f41 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -3,7 +3,7 @@ "packages/react": "0.4.11", "packages/angular": "0.0.1-experimental", "packages/web": "1.4.1", - "packages/server": "1.17.1", + "packages/server": "1.18.0", "packages/shared": "1.8.0", "packages/angular/projects/angular-sdk": "0.0.12" } diff --git a/packages/server/CHANGELOG.md b/packages/server/CHANGELOG.md index 1142bfecd..dc3ba8755 100644 --- a/packages/server/CHANGELOG.md +++ b/packages/server/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [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) diff --git a/packages/server/README.md b/packages/server/README.md index 9069395c7..748e2de9c 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/server/package.json b/packages/server/package.json index 0655c7667..8e039cfdc 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/server-sdk", - "version": "1.17.1", + "version": "1.18.0", "description": "OpenFeature SDK for JavaScript", "main": "./dist/cjs/index.js", "files": [ From 646c8793d0c2cc0d36e5b32ef092bbfc84a0c74e Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Mon, 14 Apr 2025 11:48:45 -0400 Subject: [PATCH 13/55] chore(main): release web-sdk 1.5.0 (#1156) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](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)) ### 🐛 Bug Fixes * Typo in name of the function ([2c5b37c](https://github.com/open-feature/js-sdk/commit/2c5b37c79d72d60864c27b9e67d96e99ef4ae241)) --- 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 Co-authored-by: Lukas Reining Co-authored-by: Todd Baert Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/web/CHANGELOG.md | 13 +++++++++++++ packages/web/README.md | 4 ++-- packages/web/package.json | 6 +++--- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 1d9c72f41..16ccdfdb7 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -2,7 +2,7 @@ "packages/nest": "0.2.3", "packages/react": "0.4.11", "packages/angular": "0.0.1-experimental", - "packages/web": "1.4.1", + "packages/web": "1.5.0", "packages/server": "1.18.0", "packages/shared": "1.8.0", "packages/angular/projects/angular-sdk": "0.0.12" diff --git a/packages/web/CHANGELOG.md b/packages/web/CHANGELOG.md index ba426c32f..760896a54 100644 --- a/packages/web/CHANGELOG.md +++ b/packages/web/CHANGELOG.md @@ -1,6 +1,19 @@ # Changelog +## [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](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)) + + +### 🐛 Bug Fixes + +* Typo in name of the function ([2c5b37c](https://github.com/open-feature/js-sdk/commit/2c5b37c79d72d60864c27b9e67d96e99ef4ae241)) + ## [1.4.1](https://github.com/open-feature/js-sdk/compare/web-sdk-v1.4.0...web-sdk-v1.4.1) (2025-02-07) diff --git a/packages/web/README.md b/packages/web/README.md index c862352c4..08c022fd7 100644 --- a/packages/web/README.md +++ b/packages/web/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/web/package.json b/packages/web/package.json index 39067d78a..2e071ef2b 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/web-sdk", - "version": "1.4.1", + "version": "1.5.0", "description": "OpenFeature SDK for Web", "main": "./dist/cjs/index.js", "files": [ @@ -46,9 +46,9 @@ }, "homepage": "https://github.com/open-feature/js-sdk#readme", "peerDependencies": { - "@openfeature/core": "^1.7.0" + "@openfeature/core": "^1.8.0" }, "devDependencies": { - "@openfeature/core": "^1.7.0" + "@openfeature/core": "^1.8.0" } } From b4118cbec3a2f33effc64dc8e4fbc67ee3cf0543 Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Mon, 14 Apr 2025 13:03:15 -0400 Subject: [PATCH 14/55] chore(main): release react-sdk 1.0.0 (#1154) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](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)) --- 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 Co-authored-by: Todd Baert Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/react/CHANGELOG.md | 8 ++++++++ packages/react/README.md | 4 ++-- packages/react/package.json | 4 ++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 16ccdfdb7..de672e1f3 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,6 +1,6 @@ { "packages/nest": "0.2.3", - "packages/react": "0.4.11", + "packages/react": "1.0.0", "packages/angular": "0.0.1-experimental", "packages/web": "1.5.0", "packages/server": "1.18.0", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 1b1d08299..9eebb994b 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [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) diff --git a/packages/react/README.md b/packages/react/README.md index a6226f597..c5f326407 100644 --- a/packages/react/README.md +++ b/packages/react/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/react/package.json b/packages/react/package.json index e6f5cbb64..fa8380b91 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/react-sdk", - "version": "0.4.11", + "version": "1.0.0", "description": "OpenFeature React SDK", "main": "./dist/cjs/index.js", "files": [ @@ -47,7 +47,7 @@ }, "homepage": "https://github.com/open-feature/js-sdk#readme", "peerDependencies": { - "@openfeature/web-sdk": "^1.4.1", + "@openfeature/web-sdk": "^1.5.0", "react": ">=16.8.0" }, "devDependencies": { From fa719b651b2ced0a0b0daa12b7bff89953c3b474 Mon Sep 17 00:00:00 2001 From: Lukas Reining Date: Mon, 14 Apr 2025 22:41:22 +0200 Subject: [PATCH 15/55] docs: fix readme typo (#1174) Signed-off-by: Lukas Reining Signed-off-by: Weyert de Boer --- packages/angular/projects/angular-sdk/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/angular/projects/angular-sdk/README.md b/packages/angular/projects/angular-sdk/README.md index a79b7efce..163c751ab 100644 --- a/packages/angular/projects/angular-sdk/README.md +++ b/packages/angular/projects/angular-sdk/README.md @@ -157,7 +157,7 @@ This parameter is optional, if omitted, the `thenTemplate` will always be render 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 contex change. They are set to `true` by default. +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. From da1f7378c591c860bb06fb3fe7cfaa2576a7d6d7 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Wed, 16 Apr 2025 12:27:46 -0400 Subject: [PATCH 16/55] chore: use publish env Signed-off-by: Todd Baert Signed-off-by: Weyert de Boer --- .github/workflows/release-please.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index d051a99ab..e12eda141 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -5,6 +5,7 @@ on: name: Run Release Please jobs: release-please: + environment: publish runs-on: ubuntu-latest # Release-please creates a PR that tracks all changes From 0428b0d1312d17074efc1d1e6d106da12d96ccce Mon Sep 17 00:00:00 2001 From: Lukas Reining Date: Sun, 20 Apr 2025 09:26:13 +0200 Subject: [PATCH 17/55] chore(nest): allow nestjs version 11 (#1176) Signed-off-by: Weyert de Boer --- package-lock.json | 1052 +++++++++++++++++++++++++++--------- packages/nest/README.md | 6 +- packages/nest/package.json | 12 +- 3 files changed, 802 insertions(+), 268 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6b7dc899a..a9f3728b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4094,132 +4094,6 @@ "node": ">= 10" } }, - "node_modules/@nestjs/common": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.15.tgz", - "integrity": "sha512-vaLg1ZgwhG29BuLDxPA9OAcIlgqzp9/N8iG0wGapyUNTf4IY4O6zAHgN6QalwLhFxq7nOI021vdRojR1oF3bqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "iterare": "1.2.1", - "tslib": "2.8.1", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "class-transformer": { - "optional": true - }, - "class-validator": { - "optional": true - } - } - }, - "node_modules/@nestjs/core": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.4.15.tgz", - "integrity": "sha512-UBejmdiYwaH6fTsz2QFBlC1cJHM+3UDeLZN+CiP9I1fRv2KlBZsmozGLbV5eS1JAVWJB4T5N5yQ0gjN8ZvcS2w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@nuxtjs/opencollective": "0.3.2", - "fast-safe-stringify": "2.1.1", - "iterare": "1.2.1", - "path-to-regexp": "3.3.0", - "tslib": "2.8.1", - "uid": "2.0.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0", - "@nestjs/websockets": "^10.0.0", - "reflect-metadata": "^0.1.12 || ^0.2.0", - "rxjs": "^7.1.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - }, - "@nestjs/websockets": { - "optional": true - } - } - }, - "node_modules/@nestjs/core/node_modules/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@nestjs/platform-express": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.15.tgz", - "integrity": "sha512-63ZZPkXHjoDyO7ahGOVcybZCRa7/Scp6mObQKjcX/fTEq1YJeU75ELvMsuQgc8U2opMGOBD7GVuc4DV0oeDHoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "body-parser": "1.20.3", - "cors": "2.8.5", - "express": "4.21.2", - "multer": "1.4.4-lts.1", - "tslib": "2.8.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0" - } - }, - "node_modules/@nestjs/testing": { - "version": "10.4.15", - "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.4.15.tgz", - "integrity": "sha512-eGlWESkACMKti+iZk1hs6FUY/UqObmMaa8HAN9JLnaYkoLf1Jeh+EuHlGnfqo/Rq77oznNLIyaA3PFjrFDlNUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "2.8.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nest" - }, - "peerDependencies": { - "@nestjs/common": "^10.0.0", - "@nestjs/core": "^10.0.0", - "@nestjs/microservices": "^10.0.0", - "@nestjs/platform-express": "^10.0.0" - }, - "peerDependenciesMeta": { - "@nestjs/microservices": { - "optional": true - }, - "@nestjs/platform-express": { - "optional": true - } - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4302,22 +4176,29 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@nuxtjs/opencollective": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", - "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "node_modules/@nuxt/opencollective": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", + "integrity": "sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.0", - "node-fetch": "^2.6.1" + "consola": "^3.2.3" }, "bin": { "opencollective": "bin/opencollective.js" }, "engines": { - "node": ">=8.0.0", - "npm": ">=5.0.0" + "node": "^14.18.0 || >=16.10.0", + "npm": ">=5.10.0" + } + }, + "node_modules/@nuxt/opencollective/node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" } }, "node_modules/@openfeature/angular-sdk": { @@ -5215,6 +5096,30 @@ } } }, + "node_modules/@tokenizer/inflate": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", + "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", + "dev": true, + "dependencies": { + "debug": "^4.4.0", + "fflate": "^0.8.2", + "token-types": "^6.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -7697,6 +7602,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -8251,12 +8185,6 @@ "node": ">=0.8" } }, - "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", - "dev": true - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -8617,9 +8545,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "dependencies": { "ms": "^2.1.3" @@ -8988,6 +8916,20 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -9202,13 +9144,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -9229,9 +9168,9 @@ "dev": true }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "dependencies": { "es-errors": "^1.3.0" @@ -10098,6 +10037,12 @@ "bser": "2.1.1" } }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -10110,6 +10055,24 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "20.4.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-20.4.1.tgz", + "integrity": "sha512-hw9gNZXUfZ02Jo0uafWLaFVPter5/k2rfcrjFJJHX/77xtSDOfJuEFb6oKlFV86FLP1SuyHMW1PSk0U9M5tKkQ==", + "dev": true, + "dependencies": { + "@tokenizer/inflate": "^0.2.6", + "strtok3": "^10.2.0", + "token-types": "^6.0.0", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -10449,16 +10412,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -10476,6 +10444,19 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -10590,12 +10571,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10662,9 +10643,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "engines": { "node": ">= 0.4" @@ -11530,6 +11511,12 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -13285,6 +13272,25 @@ "uc.micro": "^2.0.0" } }, + "node_modules/load-esm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/load-esm/-/load-esm-1.0.2.tgz", + "integrity": "sha512-nVAvWk/jeyrWyXEAs84mpQCYccxRqgKY4OznLuJhJCa0XsPSfdOIr2zvBZEj3IHEHbX97jjscKRRV539bW0Gpw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + }, + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/borewit" + } + ], + "engines": { + "node": ">=13.2.0" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -13594,6 +13600,15 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-to-hast": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", @@ -14094,36 +14109,6 @@ "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" } }, - "node_modules/multer": { - "version": "1.4.4-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.4-lts.1.tgz", - "integrity": "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==", - "dev": true, - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", - "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/multer/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/multicast-dns": { "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", @@ -14815,48 +14800,6 @@ "dev": true, "optional": true }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -15070,9 +15013,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "engines": { "node": ">= 0.4" @@ -15568,7 +15511,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/picocolors": { + "node_modules/peek-readable": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-7.0.0.tgz", + "integrity": "sha512-nri2TO5JE3/mRryik9LlHFT53cgHfRK0Lt0BAZQXku/AW3E6XLt2GaY8siWi7dvW/m1z0ecn+J+bpDa9ZN3IsQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", @@ -16607,6 +16563,31 @@ "typescript": "^4.5 || ^5.0" } }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", @@ -17119,6 +17100,59 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -17663,6 +17697,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strtok3": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.2.2.tgz", + "integrity": "sha512-Xt18+h4s7Z8xyZ0tmBoRmzxcop97R4BAh+dXouUDCYn+Em+1P3qpkUfI5ueWLT8ynC5hZ+q4iPEmGG1urvQGBg==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/superagent": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", @@ -18041,6 +18092,23 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", + "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -18453,6 +18521,18 @@ "node": ">=8" } }, + "node_modules/uint8array-extras": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", + "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -23583,7 +23663,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23985,7 +24064,7 @@ }, "packages/angular/projects/angular-sdk": { "name": "@openfeature/angular-sdk", - "version": "0.0.11", + "version": "0.0.12", "dependencies": { "tslib": "^2.3.0" }, @@ -24003,41 +24082,496 @@ }, "packages/nest": { "name": "@openfeature/nestjs-sdk", - "version": "0.2.2", + "version": "0.2.3", "license": "Apache-2.0", "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" }, "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", "@openfeature/server-sdk": "^1.17.1", "rxjs": "^6.0.0 || ^7.0.0 || 8.0.0" } }, + "packages/nest/node_modules/@nestjs/common": { + "version": "11.0.20", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.0.20.tgz", + "integrity": "sha512-/GH8NDCczjn6+6RNEtSNAts/nq/wQE8L1qZ9TRjqjNqEsZNE1vpFuRIhmcO2isQZ0xY5rySnpaRdrOAul3gQ3A==", + "dev": true, + "dependencies": { + "file-type": "20.4.1", + "iterare": "1.2.1", + "load-esm": "1.0.2", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "packages/nest/node_modules/@nestjs/core": { + "version": "11.0.20", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.0.20.tgz", + "integrity": "sha512-yUkEzBGiRNSEThVl6vMCXgoA9sDGWoRbJsTLdYdCC7lg7PE1iXBnna1FiBfQjT995pm0fjyM1e3WsXmyWeJXbw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nuxt/opencollective": "0.4.1", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "8.2.0", + "tslib": "2.8.1", + "uid": "2.0.2" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0", + "@nestjs/websockets": "^11.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } + } + }, + "packages/nest/node_modules/@nestjs/platform-express": { + "version": "11.0.20", + "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.0.20.tgz", + "integrity": "sha512-h/Xq2x0Qi2cr9T64w9DfLejZws1M1hYu7n7XWuC4vxX00FlfOz1jSWGgaTo/Gjq6vtULfq34Gp5Fzf0w34XDyQ==", + "dev": true, + "dependencies": { + "cors": "2.8.5", + "express": "5.1.0", + "multer": "1.4.5-lts.2", + "path-to-regexp": "8.2.0", + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0" + } + }, + "packages/nest/node_modules/@nestjs/testing": { + "version": "11.0.20", + "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-11.0.20.tgz", + "integrity": "sha512-3o+HWsVfA46tt81ctKuNj5ufL9srfmp3dQBCAIx9fzvjooEKwWl5L69AcvDh6JhdB79jhhM1lkSSU+1fBGbxgw==", + "dev": true, + "dependencies": { + "tslib": "2.8.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^11.0.0", + "@nestjs/core": "^11.0.0", + "@nestjs/microservices": "^11.0.0", + "@nestjs/platform-express": "^11.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + } + } + }, + "packages/nest/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/nest/node_modules/body-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", + "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", + "dev": true, + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.0", + "http-errors": "^2.0.0", + "iconv-lite": "^0.6.3", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.0", + "type-is": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "packages/nest/node_modules/body-parser/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/nest/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "packages/nest/node_modules/content-disposition": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", + "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/nest/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "engines": { + "node": ">=6.6.0" + } + }, + "packages/nest/node_modules/express": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", + "dev": true, + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.0", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "packages/nest/node_modules/express/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/nest/node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "dev": true, + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "packages/nest/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "packages/nest/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "packages/nest/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/nest/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "packages/nest/node_modules/mime-types": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", + "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "dev": true, + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "packages/nest/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "packages/nest/node_modules/multer": { + "version": "1.4.5-lts.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.2.tgz", + "integrity": "sha512-VzGiVigcG9zUAoCNU+xShztrlr1auZOlurXynNvO9GiWD1/mTBbUljOKY+qMeazBqXgRnjzeEgJI/wyjJUHg9A==", + "dev": true, + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "packages/nest/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "packages/nest/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "packages/nest/node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "packages/nest/node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "packages/nest/node_modules/send": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", + "dev": true, + "dependencies": { + "debug": "^4.3.5", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18" + } + }, + "packages/nest/node_modules/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "dev": true, + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + } + }, + "packages/nest/node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "packages/react": { "name": "@openfeature/react-sdk", - "version": "0.4.11", + "version": "1.0.0", "license": "Apache-2.0", "devDependencies": { "@openfeature/core": "*", "@openfeature/web-sdk": "*" }, "peerDependencies": { - "@openfeature/web-sdk": "^1.4.1", + "@openfeature/web-sdk": "^1.5.0", "react": ">=16.8.0" } }, "packages/server": { "name": "@openfeature/server-sdk", - "version": "1.17.1", + "version": "1.18.0", "license": "Apache-2.0", "devDependencies": { "@openfeature/core": "^1.7.0" @@ -24057,13 +24591,13 @@ }, "packages/web": { "name": "@openfeature/web-sdk", - "version": "1.4.1", + "version": "1.5.0", "license": "Apache-2.0", "devDependencies": { - "@openfeature/core": "^1.7.0" + "@openfeature/core": "^1.8.0" }, "peerDependencies": { - "@openfeature/core": "^1.7.0" + "@openfeature/core": "^1.8.0" } } } diff --git a/packages/nest/README.md b/packages/nest/README.md index 67a412da9..175dfdf42 100644 --- a/packages/nest/README.md +++ b/packages/nest/README.md @@ -50,7 +50,7 @@ Capabilities include: ### Requirements -- Node.js version 18+ +- Node.js version 20+ - NestJS version 8+ ### Install @@ -73,8 +73,8 @@ 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 +* `@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`. diff --git a/packages/nest/package.json b/packages/nest/package.json index 558996ef4..0e4768c22 100644 --- a/packages/nest/package.json +++ b/packages/nest/package.json @@ -46,16 +46,16 @@ }, "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.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": "1.18.0", "@types/supertest": "^6.0.0", From af4c8d55e8ff5bd1a54d2821e5ab5e125cc324dd Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Sun, 20 Apr 2025 13:07:06 -0400 Subject: [PATCH 18/55] chore(main): release nestjs-sdk 0.2.4 (#1177) Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/nest/CHANGELOG.md | 7 +++++++ packages/nest/README.md | 4 ++-- packages/nest/package.json | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index de672e1f3..c1da55625 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "packages/nest": "0.2.3", + "packages/nest": "0.2.4", "packages/react": "1.0.0", "packages/angular": "0.0.1-experimental", "packages/web": "1.5.0", diff --git a/packages/nest/CHANGELOG.md b/packages/nest/CHANGELOG.md index 8ba7a7d54..074ff604a 100644 --- a/packages/nest/CHANGELOG.md +++ b/packages/nest/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/packages/nest/README.md b/packages/nest/README.md index 175dfdf42..931d30230 100644 --- a/packages/nest/README.md +++ b/packages/nest/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/nest/package.json b/packages/nest/package.json index 0e4768c22..beda65e1b 100644 --- a/packages/nest/package.json +++ b/packages/nest/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/nestjs-sdk", - "version": "0.2.3", + "version": "0.2.4", "description": "OpenFeature Nest.js SDK", "main": "./dist/cjs/index.js", "files": [ From f5b67881597cc046419bcc933e16c493aec54b6f Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Sun, 20 Apr 2025 13:07:29 -0400 Subject: [PATCH 19/55] chore(main): release angular-sdk 0.0.13 (#1175) Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/angular/projects/angular-sdk/CHANGELOG.md | 7 +++++++ packages/angular/projects/angular-sdk/README.md | 4 ++-- packages/angular/projects/angular-sdk/package.json | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index c1da55625..b348166a2 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -5,5 +5,5 @@ "packages/web": "1.5.0", "packages/server": "1.18.0", "packages/shared": "1.8.0", - "packages/angular/projects/angular-sdk": "0.0.12" + "packages/angular/projects/angular-sdk": "0.0.13" } diff --git a/packages/angular/projects/angular-sdk/CHANGELOG.md b/packages/angular/projects/angular-sdk/CHANGELOG.md index dccda7489..60a4afcb9 100644 --- a/packages/angular/projects/angular-sdk/CHANGELOG.md +++ b/packages/angular/projects/angular-sdk/CHANGELOG.md @@ -1,6 +1,13 @@ # Changelog +## [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) diff --git a/packages/angular/projects/angular-sdk/README.md b/packages/angular/projects/angular-sdk/README.md index 163c751ab..15fb5066f 100644 --- a/packages/angular/projects/angular-sdk/README.md +++ b/packages/angular/projects/angular-sdk/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/angular/projects/angular-sdk/package.json b/packages/angular/projects/angular-sdk/package.json index f874abe88..b0b4ad17b 100644 --- a/packages/angular/projects/angular-sdk/package.json +++ b/packages/angular/projects/angular-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/angular-sdk", - "version": "0.0.12", + "version": "0.0.13", "description": "OpenFeature Angular SDK", "repository": { "type": "git", From 8867f35501feec73ae9bd1252af4c0cbd8c3656b Mon Sep 17 00:00:00 2001 From: Michael Beemer Date: Wed, 23 Apr 2025 13:16:18 -0400 Subject: [PATCH 20/55] 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 Signed-off-by: Weyert de Boer --- packages/server/README.md | 6 +++++- packages/server/src/open-feature.ts | 4 ++-- packages/web/README.md | 12 ++++++++++-- packages/web/src/open-feature.ts | 8 ++++---- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/server/README.md b/packages/server/README.md index 748e2de9c..2bc75bb48 100644 --- a/packages/server/README.md +++ b/packages/server/README.md @@ -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(); diff --git a/packages/server/src/open-feature.ts b/packages/server/src/open-feature.ts index 3e818af05..01decf154 100644 --- a/packages/server/src/open-feature.ts +++ b/packages/server/src/open-feature.ts @@ -82,7 +82,7 @@ export class OpenFeatureAPI * Setting a provider supersedes the current provider used in new and existing unbound clients. * @param {Provider} provider The provider responsible for flag evaluations. * @returns {Promise} - * @throws Uncaught exceptions thrown by the provider during initialization. + * @throws {Error} If the provider throws an exception during initialization. */ setProviderAndWait(provider: Provider): Promise; /** @@ -92,7 +92,7 @@ export class OpenFeatureAPI * @param {string} domain The name to identify the client * @param {Provider} provider The provider responsible for flag evaluations. * @returns {Promise} - * @throws Uncaught exceptions thrown by the provider during initialization. + * @throws {Error} If the provider throws an exception during initialization. */ setProviderAndWait(domain: string, provider: Provider): Promise; async setProviderAndWait(domainOrProvider?: string | Provider, providerOrUndefined?: Provider): Promise { diff --git a/packages/web/README.md b/packages/web/README.md index 08c022fd7..cb5ca7f99 100644 --- a/packages/web/README.md +++ b/packages/web/README.md @@ -75,7 +75,11 @@ yarn add @openfeature/web-sdk @openfeature/core import { OpenFeature } from '@openfeature/web-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(); @@ -121,7 +125,11 @@ Once you've added a provider as a dependency, it can be registered with OpenFeat To register a provider and ensure it is ready before further actions are taken, you can use the `setProviderAndWait` method as shown below: ```ts -await OpenFeature.setProviderAndWait(new MyProvider()); +try { + await OpenFeature.setProviderAndWait(new MyProvider()); +} catch (error) { + console.error('Failed to initialize provider:', error); +} ``` #### Synchronous diff --git a/packages/web/src/open-feature.ts b/packages/web/src/open-feature.ts index eb32877db..57d714a47 100644 --- a/packages/web/src/open-feature.ts +++ b/packages/web/src/open-feature.ts @@ -77,7 +77,7 @@ export class OpenFeatureAPI * Setting a provider supersedes the current provider used in new and existing unbound clients. * @param {Provider} provider The provider responsible for flag evaluations. * @returns {Promise} - * @throws Uncaught exceptions thrown by the provider during initialization. + * @throws {Error} If the provider throws an exception during initialization. */ setProviderAndWait(provider: Provider): Promise; /** @@ -87,7 +87,7 @@ export class OpenFeatureAPI * @param {Provider} provider The provider responsible for flag evaluations. * @param {EvaluationContext} context The evaluation context to use for flag evaluations. * @returns {Promise} - * @throws Uncaught exceptions thrown by the provider during initialization. + * @throws {Error} If the provider throws an exception during initialization. */ setProviderAndWait(provider: Provider, context: EvaluationContext): Promise; /** @@ -97,7 +97,7 @@ export class OpenFeatureAPI * @param {string} domain The name to identify the client * @param {Provider} provider The provider responsible for flag evaluations. * @returns {Promise} - * @throws Uncaught exceptions thrown by the provider during initialization. + * @throws {Error} If the provider throws an exception during initialization. */ setProviderAndWait(domain: string, provider: Provider): Promise; /** @@ -108,7 +108,7 @@ export class OpenFeatureAPI * @param {Provider} provider The provider responsible for flag evaluations. * @param {EvaluationContext} context The evaluation context to use for flag evaluations. * @returns {Promise} - * @throws Uncaught exceptions thrown by the provider during initialization. + * @throws {Error} If the provider throws an exception during initialization. */ setProviderAndWait(domain: string, provider: Provider, context: EvaluationContext): Promise; async setProviderAndWait( From 55014041058705041ca37f5be31714e643dfb723 Mon Sep 17 00:00:00 2001 From: Kaushal Kapasi <91074031+kaushalkapasi@users.noreply.github.com> Date: Thu, 24 Apr 2025 09:32:55 -0400 Subject: [PATCH 21/55] 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 Signed-off-by: Todd Baert Co-authored-by: Todd Baert Signed-off-by: Weyert de Boer --- packages/nest/README.md | 26 ++++- packages/nest/src/feature.decorator.ts | 22 +--- packages/nest/src/index.ts | 1 + .../src/require-flags-enabled.decorator.ts | 104 ++++++++++++++++++ packages/nest/src/utils.ts | 12 ++ packages/nest/test/fixtures.ts | 12 ++ packages/nest/test/open-feature-sdk.spec.ts | 95 ++++++++++++++-- packages/nest/test/test-app.ts | 67 ++++++++++- 8 files changed, 300 insertions(+), 39 deletions(-) create mode 100644 packages/nest/src/require-flags-enabled.decorator.ts create mode 100644 packages/nest/src/utils.ts diff --git a/packages/nest/README.md b/packages/nest/README.md index 931d30230..dfcd0093c 100644 --- a/packages/nest/README.md +++ b/packages/nest/README.md @@ -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 || ^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.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 diff --git a/packages/nest/src/feature.decorator.ts b/packages/nest/src/feature.decorator.ts index c6dba0623..aa728eb5f 100644 --- a/packages/nest/src/feature.decorator.ts +++ b/packages/nest/src/feature.decorator.ts @@ -1,16 +1,10 @@ import { createParamDecorator, Inject } from '@nestjs/common'; -import type { - EvaluationContext, - EvaluationDetails, - FlagValue, - JsonValue} from '@openfeature/server-sdk'; -import { - 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 type { Observable } from 'rxjs'; import { from } from 'rxjs'; +import { getClientForEvaluation } from './utils'; /** * Options for injecting an OpenFeature client into a constructor. @@ -56,16 +50,6 @@ interface FeatureProps { 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. * diff --git a/packages/nest/src/index.ts b/packages/nest/src/index.ts index 20514df86..7296307e8 100644 --- a/packages/nest/src/index.ts +++ b/packages/nest/src/index.ts @@ -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'; diff --git a/packages/nest/src/require-flags-enabled.decorator.ts b/packages/nest/src/require-flags-enabled.decorator.ts new file mode 100644 index 000000000..1888f9974 --- /dev/null +++ b/packages/nest/src/require-flags-enabled.decorator.ts @@ -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); +}; diff --git a/packages/nest/src/utils.ts b/packages/nest/src/utils.ts new file mode 100644 index 000000000..aec145b61 --- /dev/null +++ b/packages/nest/src/utils.ts @@ -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); +} diff --git a/packages/nest/test/fixtures.ts b/packages/nest/test/fixtures.ts index b773682aa..352770c7b 100644 --- a/packages/nest/test/fixtures.ts +++ b/packages/nest/test/fixtures.ts @@ -1,4 +1,5 @@ import { InMemoryProvider } from '@openfeature/server-sdk'; +import type { EvaluationContext } from '@openfeature/server-sdk'; import type { ExecutionContext } from '@nestjs/common'; import { OpenFeatureModule } from '../src'; @@ -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 = { diff --git a/packages/nest/test/open-feature-sdk.spec.ts b/packages/nest/test/open-feature-sdk.spec.ts index 901f810fd..fb6d64f5f 100644 --- a/packages/nest/test/open-feature-sdk.spec.ts +++ b/packages/nest/test/open-feature-sdk.spec.ts @@ -2,7 +2,12 @@ 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'; @@ -14,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(); @@ -112,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') @@ -122,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(); @@ -158,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') @@ -172,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); + }); + }); }); }); diff --git a/packages/nest/test/test-app.ts b/packages/nest/test/test-app.ts index c717b1a1f..aa5358cd6 100644 --- a/packages/nest/test/test-app.ts +++ b/packages/nest/test/test-app.ts @@ -1,7 +1,14 @@ -import { Controller, Get, Injectable, UseInterceptors } from '@nestjs/common'; -import type { Observable} from 'rxjs'; +import { Controller, ForbiddenException, Get, Injectable, UseInterceptors } from '@nestjs/common'; +import type { Observable } from 'rxjs'; import { map } from 'rxjs'; -import { BooleanFeatureFlag, ObjectFeatureFlag, NumberFeatureFlag, OpenFeatureClient, StringFeatureFlag } from '../src'; +import { + BooleanFeatureFlag, + ObjectFeatureFlag, + NumberFeatureFlag, + OpenFeatureClient, + StringFeatureFlag, + RequireFlagsEnabled, +} from '../src'; import type { Client, EvaluationDetails, FlagValue } from '@openfeature/server-sdk'; import { EvaluationContextInterceptor } from '../src'; @@ -84,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') @@ -101,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!'; + } } From 5c86989543274585472897c2023c5bb5b0ac699e Mon Sep 17 00:00:00 2001 From: Michael Beemer Date: Thu, 24 Apr 2025 12:25:37 -0400 Subject: [PATCH 22/55] 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 Signed-off-by: Weyert de Boer --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index a9f3728b5..1edf4e541 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24064,7 +24064,7 @@ }, "packages/angular/projects/angular-sdk": { "name": "@openfeature/angular-sdk", - "version": "0.0.12", + "version": "0.0.13", "dependencies": { "tslib": "^2.3.0" }, @@ -24082,7 +24082,7 @@ }, "packages/nest": { "name": "@openfeature/nestjs-sdk", - "version": "0.2.3", + "version": "0.2.4", "license": "Apache-2.0", "devDependencies": { "@nestjs/common": "^11.0.20", From a9e837c63b212ab28111e7eefec11f587f0818dd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 13:01:21 -0400 Subject: [PATCH 23/55] chore(deps): update dependency @types/node to v20.17.31 (#1138) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1edf4e541..d944ac503 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5460,9 +5460,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.17.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.16.tgz", - "integrity": "sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==", + "version": "20.17.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.31.tgz", + "integrity": "sha512-quODOCNXQAbNf1Q7V+fI8WyErOCh0D5Yd31vHnKu4GkSztGQ7rlltAaqXhHhLl33tlVyUXs2386MkANSwgDn6A==", "dev": true, "license": "MIT", "dependencies": { @@ -23663,6 +23663,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" From 7e2a753c60006c4feaf321ff7f7380bee3c93322 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 May 2025 11:48:00 -0400 Subject: [PATCH 24/55] chore(deps): update dependency @types/node to v22 (#1067) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 19 ++++++++++--------- package.json | 2 +- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index d944ac503..9e89fe8d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "@testing-library/jest-dom": "^6.4.2", "@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": "^10.0.0", "esbuild": "^0.25.0", @@ -5460,13 +5460,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.17.31", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.31.tgz", - "integrity": "sha512-quODOCNXQAbNf1Q7V+fI8WyErOCh0D5Yd31vHnKu4GkSztGQ7rlltAaqXhHhLl33tlVyUXs2386MkANSwgDn6A==", + "version": "22.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", + "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.21.0" } }, "node_modules/@types/node-forge": { @@ -18549,10 +18549,11 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", - "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", - "dev": true + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.1", diff --git a/package.json b/package.json index 3104c1b41..7de116e56 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "@testing-library/jest-dom": "^6.4.2", "@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": "^10.0.0", "esbuild": "^0.25.0", From 51037db633a877cc425a696ff72e082bb0f14eff Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 May 2025 11:48:17 -0400 Subject: [PATCH 25/55] chore(deps): update dependency @types/supertest to v6.0.3 (#1169) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e89fe8d0..a54d78e3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5577,10 +5577,11 @@ } }, "node_modules/@types/supertest": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz", - "integrity": "sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", "dev": true, + "license": "MIT", "dependencies": { "@types/methods": "^1.1.4", "@types/superagent": "^8.1.0" @@ -24093,7 +24094,7 @@ "@nestjs/testing": "^11.0.20", "@openfeature/core": "*", "@openfeature/server-sdk": "1.18.0", - "@types/supertest": "^6.0.0", + "@types/supertest": "^6.0.3", "supertest": "^7.0.0" }, "peerDependencies": { From e9f2c41e71c3bd79cda82855b132fee7a63e13e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 May 2025 11:48:41 -0400 Subject: [PATCH 26/55] chore(deps): update dependency rollup to v4.40.2 (#1131) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
rollup/rollup (rollup) ### [`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 ([#​5934](https://redirect.github.com/rollup/rollup/issues/5934)) - Fix execution order when using top-level await for dynamic imports with inlineDynamicImports ([#​5937](https://redirect.github.com/rollup/rollup/issues/5937)) - Throw when the output is watched in watch mode ([#​5939](https://redirect.github.com/rollup/rollup/issues/5939)) ##### Pull Requests - [#​5934](https://redirect.github.com/rollup/rollup/pull/5934): fix(exports): avoid "exports is not defined" `ReferenceError` ([@​dasa](https://redirect.github.com/dasa)) - [#​5937](https://redirect.github.com/rollup/rollup/pull/5937): consider TLA imports have higher execution priority ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5939](https://redirect.github.com/rollup/rollup/pull/5939): fix: watch mode input should not be an output subpath ([@​btea](https://redirect.github.com/btea)) - [#​5940](https://redirect.github.com/rollup/rollup/pull/5940): chore(deps): update dependency vite to v6.3.4 \[security] ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5941](https://redirect.github.com/rollup/rollup/pull/5941): chore(deps): update dependency eslint-plugin-unicorn to v59 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5942](https://redirect.github.com/rollup/rollup/pull/5942): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5943](https://redirect.github.com/rollup/rollup/pull/5943): fix(deps): lock file maintenance minor/patch updates ([@​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 ([#​5921](https://redirect.github.com/rollup/rollup/issues/5921)) - Do not inline user-defined entry chunks or chunks with explicit file name ([#​5923](https://redirect.github.com/rollup/rollup/issues/5923)) - Avoid top-level-await cycles when non-entry chunks use top-level await ([#​5930](https://redirect.github.com/rollup/rollup/issues/5930)) - Expose package.json via exports ([#​5931](https://redirect.github.com/rollup/rollup/issues/5931)) ##### Pull Requests - [#​5921](https://redirect.github.com/rollup/rollup/pull/5921): fix(assetFileNames): reduce max hash size to 21 ([@​shulaoda](https://redirect.github.com/shulaoda)) - [#​5923](https://redirect.github.com/rollup/rollup/pull/5923): fix: generate the separate chunk for the entry module with explicated chunk filename or name ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5926](https://redirect.github.com/rollup/rollup/pull/5926): fix(deps): update rust crate swc_compiler_base to v18 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5927](https://redirect.github.com/rollup/rollup/pull/5927): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5928](https://redirect.github.com/rollup/rollup/pull/5928): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5930](https://redirect.github.com/rollup/rollup/pull/5930): Avoid chunks TLA dynamic import circular when TLA dynamic import used in non-entry modules ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5931](https://redirect.github.com/rollup/rollup/pull/5931): chore: add new `./package.json` entry ([@​JounQin](https://redirect.github.com/JounQin), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5936](https://redirect.github.com/rollup/rollup/pull/5936): fix(deps): lock file maintenance minor/patch updates ([@​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 ([#​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 ([#​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 ([#​5900](https://redirect.github.com/rollup/rollup/issues/5900)) - Fix namespace rendering when tree-shaking is disabled ([#​5908](https://redirect.github.com/rollup/rollup/issues/5908)) - When using multiple transform hook filters, all of them need to be satisfied together ([#​5909](https://redirect.github.com/rollup/rollup/issues/5909)) ##### Pull Requests - [#​5892](https://redirect.github.com/rollup/rollup/pull/5892): Warn when eval or namespace calls are rendered, not when they are parsed ([@​SunsetFi](https://redirect.github.com/SunsetFi), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5898](https://redirect.github.com/rollup/rollup/pull/5898): feat: treeshake dynamic import chained member expression ([@​privatenumber](https://redirect.github.com/privatenumber), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5900](https://redirect.github.com/rollup/rollup/pull/5900): consider the dynamic import within a TLA call expression as a TLA import ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5904](https://redirect.github.com/rollup/rollup/pull/5904): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5905](https://redirect.github.com/rollup/rollup/pull/5905): chore(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5908](https://redirect.github.com/rollup/rollup/pull/5908): Fix `treeshake: false` breaking destructured namespace imports ([@​Skn0tt](https://redirect.github.com/Skn0tt)) - [#​5909](https://redirect.github.com/rollup/rollup/pull/5909): Correct the behavior when multiple transform filter options are specified ([@​sapphi-red](https://redirect.github.com/sapphi-red)) - [#​5915](https://redirect.github.com/rollup/rollup/pull/5915): chore(deps): update dependency [@​types/picomatch](https://redirect.github.com/types/picomatch) to v4 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5916](https://redirect.github.com/rollup/rollup/pull/5916): fix(deps): update rust crate swc_compiler_base to v17 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5917](https://redirect.github.com/rollup/rollup/pull/5917): chore(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5918](https://redirect.github.com/rollup/rollup/pull/5918): chore(deps): update dependency vite to v6.2.6 \[security] ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​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 ([#​5891](https://redirect.github.com/rollup/rollup/issues/5891)) ##### Bug Fixes - Mark the `id` property as optional in the filter for the `resolveId` hook ([#​5896](https://redirect.github.com/rollup/rollup/issues/5896)) ##### Pull Requests - [#​5891](https://redirect.github.com/rollup/rollup/pull/5891): chunk: merge allow-extension modules ([@​wmertens](https://redirect.github.com/wmertens), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5893](https://redirect.github.com/rollup/rollup/pull/5893): chore(deps): update dependency vite to v6.2.4 \[security] ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5896](https://redirect.github.com/rollup/rollup/pull/5896): fix: resolveId id filter is optional ([@​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 ([#​5882](https://redirect.github.com/rollup/rollup/issues/5882)) ##### Pull Requests - [#​5882](https://redirect.github.com/rollup/rollup/pull/5882): Add support for hook filters ([@​sapphi-red](https://redirect.github.com/sapphi-red)) - [#​5894](https://redirect.github.com/rollup/rollup/pull/5894): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5895](https://redirect.github.com/rollup/rollup/pull/5895): chore(deps): update dependency eslint-plugin-unicorn to v58 ([@​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 ([#​5726](https://redirect.github.com/rollup/rollup/issues/5726)) - Handles class decorators placed before the `export` keyword ([#​5871](https://redirect.github.com/rollup/rollup/issues/5871)) ##### Bug Fixes - Log Rust panic messages to the console when using the WASM build ([#​5875](https://redirect.github.com/rollup/rollup/issues/5875)) ##### Pull Requests - [#​5726](https://redirect.github.com/rollup/rollup/pull/5726): Add support for linux riscv64 musl ([@​fossdd](https://redirect.github.com/fossdd), [@​leso-kn](https://redirect.github.com/leso-kn)) - [#​5871](https://redirect.github.com/rollup/rollup/pull/5871): feat: support decorators before or after export ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5875](https://redirect.github.com/rollup/rollup/pull/5875): capture Rust panic messages and output them to the console. ([@​luyahan](https://redirect.github.com/luyahan), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5883](https://redirect.github.com/rollup/rollup/pull/5883): Pin digest of 3rd party actions ([@​re-taro](https://redirect.github.com/re-taro)) - [#​5885](https://redirect.github.com/rollup/rollup/pull/5885): fix(deps): lock file maintenance minor/patch updates ([@​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 ([#​5870](https://redirect.github.com/rollup/rollup/issues/5870)) - Export several additional types used by Vite ([#​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 ([#​5843](https://redirect.github.com/rollup/rollup/issues/5843)) ##### Pull Requests - [#​5843](https://redirect.github.com/rollup/rollup/pull/5843): avoiding top level await circular ([@​TrickyPi](https://redirect.github.com/TrickyPi), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5870](https://redirect.github.com/rollup/rollup/pull/5870): draft for extended renderDynamicImport hook ([@​iczero](https://redirect.github.com/iczero), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5876](https://redirect.github.com/rollup/rollup/pull/5876): Update axios overrides to 1.8.2 ([@​vadym-khodak](https://redirect.github.com/vadym-khodak)) - [#​5877](https://redirect.github.com/rollup/rollup/pull/5877): chore(deps): update dependency eslint-plugin-vue to v10 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5878](https://redirect.github.com/rollup/rollup/pull/5878): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5879](https://redirect.github.com/rollup/rollup/pull/5879): fix: export types ([@​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 ([#​5867](https://redirect.github.com/rollup/rollup/issues/5867)) ##### Pull Requests - [#​5852](https://redirect.github.com/rollup/rollup/pull/5852): chore(deps): update dependency eslint-plugin-unicorn to v57 ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5862](https://redirect.github.com/rollup/rollup/pull/5862): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5867](https://redirect.github.com/rollup/rollup/pull/5867): feat(5858): make closeBundle hook receive the last error ([@​GauBen](https://redirect.github.com/GauBen)) - [#​5872](https://redirect.github.com/rollup/rollup/pull/5872): chore(deps): update dependency builtin-modules to v5 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5873](https://redirect.github.com/rollup/rollup/pull/5873): chore(deps): update uraimo/run-on-arch-action action to v3 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5874](https://redirect.github.com/rollup/rollup/pull/5874): fix(deps): lock file maintenance minor/patch updates ([@​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 ([#​5866](https://redirect.github.com/rollup/rollup/issues/5866)) - Allow the CustomPluginOptions to be extended ([#​5850](https://redirect.github.com/rollup/rollup/issues/5850)) ##### Pull Requests - [#​5850](https://redirect.github.com/rollup/rollup/pull/5850): Revert CustomPluginOptions to be an interface ([@​sapphi-red](https://redirect.github.com/sapphi-red), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5851](https://redirect.github.com/rollup/rollup/pull/5851): Javascript to JavaScript ([@​dasa](https://redirect.github.com/dasa), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5853](https://redirect.github.com/rollup/rollup/pull/5853): chore(deps): update dependency pinia to v3 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5854](https://redirect.github.com/rollup/rollup/pull/5854): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5855](https://redirect.github.com/rollup/rollup/pull/5855): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5860](https://redirect.github.com/rollup/rollup/pull/5860): chore(deps): update dependency [@​shikijs/vitepress-twoslash](https://redirect.github.com/shikijs/vitepress-twoslash) to v3 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5861](https://redirect.github.com/rollup/rollup/pull/5861): chore(deps): update dependency globals to v16 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5863](https://redirect.github.com/rollup/rollup/pull/5863): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5864](https://redirect.github.com/rollup/rollup/pull/5864): chore(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5866](https://redirect.github.com/rollup/rollup/pull/5866): Add jsx parameter to parseAsync in native.wasm.js ([@​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 ([#​5846](https://redirect.github.com/rollup/rollup/issues/5846)) ##### Pull Requests - [#​5846](https://redirect.github.com/rollup/rollup/pull/5846): return UnknownValue if the usedbranch is unkown and the path is not empty ([@​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 ([#​5842](https://redirect.github.com/rollup/rollup/issues/5842)) ##### Pull Requests - [#​5840](https://redirect.github.com/rollup/rollup/pull/5840): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5842](https://redirect.github.com/rollup/rollup/pull/5842): Fix prop inclusion with try-catch-deoptimization ([@​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 ([#​5838](https://redirect.github.com/rollup/rollup/issues/5838)) ##### Pull Requests - [#​5835](https://redirect.github.com/rollup/rollup/pull/5835): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5838](https://redirect.github.com/rollup/rollup/pull/5838): replace undefined with void 0 for operator void ([@​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 ([#​5837](https://redirect.github.com/rollup/rollup/issues/5837)) ##### Pull Requests - [#​5836](https://redirect.github.com/rollup/rollup/pull/5836): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5837](https://redirect.github.com/rollup/rollup/pull/5837): Include all paths of reexports if namespace is used ([@​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 ([#​5833](https://redirect.github.com/rollup/rollup/issues/5833)) ##### Pull Requests - [#​5833](https://redirect.github.com/rollup/rollup/pull/5833): include all properties if a rest element is destructed ([@​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 ([#​5831](https://redirect.github.com/rollup/rollup/issues/5831)) ##### Pull Requests - [#​5831](https://redirect.github.com/rollup/rollup/pull/5831): include the properties that accessed by this ([@​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 ([#​5827](https://redirect.github.com/rollup/rollup/issues/5827)) ##### Pull Requests - [#​5827](https://redirect.github.com/rollup/rollup/pull/5827): Ensure that functions provided to a constructor are properly deoptimized ([@​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 ([#​5825](https://redirect.github.com/rollup/rollup/issues/5825)) ##### Pull Requests - [#​5825](https://redirect.github.com/rollup/rollup/pull/5825): Ensure that all properties of throw statements are included ([@​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 [#​5420](https://redirect.github.com/rollup/rollup/issues/5420)) ([#​5737](https://redirect.github.com/rollup/rollup/issues/5737)) ##### Pull Requests - [#​5737](https://redirect.github.com/rollup/rollup/pull/5737): Reapply object tree-shaking ([@​lukastaegert](https://redirect.github.com/lukastaegert), [@​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 ([#​5812](https://redirect.github.com/rollup/rollup/issues/5812)) ##### Bug Fixes - Use the correct with/assert attribute key in dynamic imports ([#​5818](https://redirect.github.com/rollup/rollup/issues/5818)) - Fix an issue where logical expressions were considered to have the wrong value ([#​5819](https://redirect.github.com/rollup/rollup/issues/5819)) ##### Pull Requests - [#​5812](https://redirect.github.com/rollup/rollup/pull/5812): feat: optimize the literal value of unary expressions ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5816](https://redirect.github.com/rollup/rollup/pull/5816): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5817](https://redirect.github.com/rollup/rollup/pull/5817): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5818](https://redirect.github.com/rollup/rollup/pull/5818): support for changing the attributes key for dynamic imports ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5819](https://redirect.github.com/rollup/rollup/pull/5819): Return UnknownValue if getLiteralValueAtPath is called recursively within logical expressions ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5820](https://redirect.github.com/rollup/rollup/pull/5820): return null ([@​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 ([#​5804](https://redirect.github.com/rollup/rollup/issues/5804)) ##### Pull Requests - [#​5804](https://redirect.github.com/rollup/rollup/pull/5804): fix: set hasDeoptimizedCache to true as early as possible ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5813](https://redirect.github.com/rollup/rollup/pull/5813): Fix typo ([@​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 ([#​5799](https://redirect.github.com/rollup/rollup/issues/5799)) ##### Bug Fixes - Fix incorrect urls in CLI warnings ([#​5809](https://redirect.github.com/rollup/rollup/issues/5809)) ##### Pull Requests - [#​5799](https://redirect.github.com/rollup/rollup/pull/5799): Feature/watch on invalidate ([@​drebrez](https://redirect.github.com/drebrez), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5808](https://redirect.github.com/rollup/rollup/pull/5808): chore(deps): update dependency vite to v6.0.9 \[security] ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5809](https://redirect.github.com/rollup/rollup/pull/5809): fix: avoid duplicate rollupjs.org prefix ([@​GauBen](https://redirect.github.com/GauBen), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5810](https://redirect.github.com/rollup/rollup/pull/5810): chore(deps): update dependency [@​shikijs/vitepress-twoslash](https://redirect.github.com/shikijs/vitepress-twoslash) to v2 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5811](https://redirect.github.com/rollup/rollup/pull/5811): fix(deps): lock file maintenance minor/patch updates ([@​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 ([#​5803](https://redirect.github.com/rollup/rollup/issues/5803)) ##### Bug Fixes - Handle files with more than one UTF-8 BOM header ([#​5806](https://redirect.github.com/rollup/rollup/issues/5806)) ##### Pull Requests - [#​5792](https://redirect.github.com/rollup/rollup/pull/5792): fix(deps): update rust crate swc_compiler_base to v8 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5793](https://redirect.github.com/rollup/rollup/pull/5793): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5794](https://redirect.github.com/rollup/rollup/pull/5794): chore(deps): lock file maintenance ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5801](https://redirect.github.com/rollup/rollup/pull/5801): chore(deps): update dependency eslint-config-prettier to v10 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5802](https://redirect.github.com/rollup/rollup/pull/5802): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5803](https://redirect.github.com/rollup/rollup/pull/5803): Support watch mode in yarn, gradle and containers ([@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5806](https://redirect.github.com/rollup/rollup/pull/5806): fix: strip all BOMs ([@​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 ([#​5786](https://redirect.github.com/rollup/rollup/issues/5786)) ##### Pull Requests - [#​5786](https://redirect.github.com/rollup/rollup/pull/5786): fix: consider that literals cannot following switch case. ([@​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 ([#​5775](https://redirect.github.com/rollup/rollup/issues/5775)) ##### Pull Requests - [#​5775](https://redirect.github.com/rollup/rollup/pull/5775): feat: enhance the treehshaking for unary expression ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5783](https://redirect.github.com/rollup/rollup/pull/5783): Improve CI caching for node_modules ([@​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 ([#​5781](https://redirect.github.com/rollup/rollup/issues/5781)) ##### Pull Requests - [#​5772](https://redirect.github.com/rollup/rollup/pull/5772): Improve caching on CI ([@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5773](https://redirect.github.com/rollup/rollup/pull/5773): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5780](https://redirect.github.com/rollup/rollup/pull/5780): feat: use picocolors instead of colorette ([@​re-taro](https://redirect.github.com/re-taro)) - [#​5781](https://redirect.github.com/rollup/rollup/pull/5781): fix: keep import attributes for cjs format ([@​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 ([#​5771](https://redirect.github.com/rollup/rollup/issues/5771)) ##### Pull Requests - [#​5769](https://redirect.github.com/rollup/rollup/pull/5769): Remove unnecessary lifetimes ([@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5771](https://redirect.github.com/rollup/rollup/pull/5771): fix: do not optimize the literal value if the cache is deoptimized ([@​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 ([#​5763](https://redirect.github.com/rollup/rollup/issues/5763)) ##### Pull Requests - [#​5759](https://redirect.github.com/rollup/rollup/pull/5759): docs: add utf-8 encoding to JSON file reading ([@​chouchouji](https://redirect.github.com/chouchouji)) - [#​5760](https://redirect.github.com/rollup/rollup/pull/5760): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5763](https://redirect.github.com/rollup/rollup/pull/5763): fix: introduce UnknownFalsyValue for enhancing if statement tree-shaking ([@​TrickyPi](https://redirect.github.com/TrickyPi)) - [#​5766](https://redirect.github.com/rollup/rollup/pull/5766): chore(deps): update dependency [@​rollup/plugin-node-resolve](https://redirect.github.com/rollup/plugin-node-resolve) to v16 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5767](https://redirect.github.com/rollup/rollup/pull/5767): fix(deps): lock file maintenance minor/patch updates ([@​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 ([#​5749](https://redirect.github.com/rollup/rollup/issues/5749)) - Add optional `debugId` to `SourceMap` types ([#​5751](https://redirect.github.com/rollup/rollup/issues/5751)) ##### Pull Requests - [#​5749](https://redirect.github.com/rollup/rollup/pull/5749): feat: add support for LoongArch ([@​darkyzhou](https://redirect.github.com/darkyzhou)) - [#​5751](https://redirect.github.com/rollup/rollup/pull/5751): feat: Add `debugId` to `SourceMap` types ([@​timfish](https://redirect.github.com/timfish), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5752](https://redirect.github.com/rollup/rollup/pull/5752): chore(deps): update dependency mocha to v11 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5753](https://redirect.github.com/rollup/rollup/pull/5753): chore(deps): update dependency vite to v6 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5754](https://redirect.github.com/rollup/rollup/pull/5754): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5755](https://redirect.github.com/rollup/rollup/pull/5755): chore(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5756](https://redirect.github.com/rollup/rollup/pull/5756): Test if saving the Cargo cache can speed up FreeBSD ([@​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 ([#​5743](https://redirect.github.com/rollup/rollup/issues/5743)) ##### Pull Requests - [#​5743](https://redirect.github.com/rollup/rollup/pull/5743): fix: supports modify the import attributes key in the config file ([@​TrickyPi](https://redirect.github.com/TrickyPi), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5747](https://redirect.github.com/rollup/rollup/pull/5747): chore(deps): update codecov/codecov-action action to v5 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5748](https://redirect.github.com/rollup/rollup/pull/5748): chore(deps): lock file maintenance minor/patch updates ([@​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 ([#​5740](https://redirect.github.com/rollup/rollup/issues/5740)) ##### Pull Requests - [#​5740](https://redirect.github.com/rollup/rollup/pull/5740): chore(deps): lock file maintenance minor/patch updates ([@​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 ([#​5736](https://redirect.github.com/rollup/rollup/issues/5736)) ##### Pull Requests - [#​5736](https://redirect.github.com/rollup/rollup/pull/5736): Revert object tree-shaking until some issues have been resolved ([@​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 ([#​5728](https://redirect.github.com/rollup/rollup/issues/5728)) ##### Pull Requests - [#​5728](https://redirect.github.com/rollup/rollup/pull/5728): Fix more variable deconflicting issues ([@​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 ([#​5727](https://redirect.github.com/rollup/rollup/issues/5727)) ##### Pull Requests - [#​5727](https://redirect.github.com/rollup/rollup/pull/5727): Debug out-of-memory issues with Rollup v4.27.0 ([@​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 ([#​5420](https://redirect.github.com/rollup/rollup/issues/5420)) ##### Bug Fixes - Change hash length limit to 21 to avoid inconsistent hash length ([#​5423](https://redirect.github.com/rollup/rollup/issues/5423)) ##### Pull Requests - [#​5420](https://redirect.github.com/rollup/rollup/pull/5420): feat: implement object tree-shaking ([@​TrickyPi](https://redirect.github.com/TrickyPi), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5723](https://redirect.github.com/rollup/rollup/pull/5723): Reduce max hash size to 21 ([@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5724](https://redirect.github.com/rollup/rollup/pull/5724): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5725](https://redirect.github.com/rollup/rollup/pull/5725): chore(deps): lock file maintenance minor/patch updates ([@​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 ([#​5721](https://redirect.github.com/rollup/rollup/issues/5721)) ##### Pull Requests - [#​5721](https://redirect.github.com/rollup/rollup/pull/5721): feat: support `using` for `RollupBuild` ([@​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 ([#​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 ([#​5719](https://redirect.github.com/rollup/rollup/issues/5719)) ##### Pull Requests - [#​5712](https://redirect.github.com/rollup/rollup/pull/5712): feat: Add support for injecting Debug IDs ([@​timfish](https://redirect.github.com/timfish)) - [#​5717](https://redirect.github.com/rollup/rollup/pull/5717): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5718](https://redirect.github.com/rollup/rollup/pull/5718): chore(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5719](https://redirect.github.com/rollup/rollup/pull/5719): Use a less surprising base-16 encoding ([@​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 ([#​5713](https://redirect.github.com/rollup/rollup/issues/5713)) ##### Pull Requests - [#​5708](https://redirect.github.com/rollup/rollup/pull/5708): Update configuration-options document ([@​sacru2red](https://redirect.github.com/sacru2red), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5711](https://redirect.github.com/rollup/rollup/pull/5711): chore(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5713](https://redirect.github.com/rollup/rollup/pull/5713): fix: Deoptimize the proxied object if its property is reassigned in the handler functions ([@​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 ([#​5703](https://redirect.github.com/rollup/rollup/issues/5703)) ##### Pull Requests - [#​5703](https://redirect.github.com/rollup/rollup/pull/5703): perf: use pre-allocated arrays for known result sizes ([@​GalacticHypernova](https://redirect.github.com/GalacticHypernova))
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 208 +++++++++++++++++++++++++++++----------------- 1 file changed, 132 insertions(+), 76 deletions(-) diff --git a/package-lock.json b/package-lock.json index a54d78e3e..9253cc9c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4656,234 +4656,280 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.2.tgz", - "integrity": "sha512-ufoveNTKDg9t/b7nqI3lwbCG/9IJMhADBNjjz/Jn6LxIZxD7T5L8l2uO/wD99945F1Oo8FvgbbZJRguyk/BdzA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.2.tgz", - "integrity": "sha512-iZoYCiJz3Uek4NI0J06/ZxUgwAfNzqltK0MptPDO4OR0a88R4h0DSELMsflS6ibMCJ4PnLvq8f7O1d7WexUvIA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.2.tgz", - "integrity": "sha512-/UhrIxobHYCBfhi5paTkUDQ0w+jckjRZDZ1kcBL132WeHZQ6+S5v9jQPVGLVrLbNUebdIRpIt00lQ+4Z7ys4Rg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.2.tgz", - "integrity": "sha512-1F/jrfhxJtWILusgx63WeTvGTwE4vmsT9+e/z7cZLKU8sBMddwqw3UV5ERfOV+H1FuRK3YREZ46J4Gy0aP3qDA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.24.2.tgz", - "integrity": "sha512-1YWOpFcGuC6iGAS4EI+o3BV2/6S0H+m9kFOIlyFtp4xIX5rjSnL3AwbTBxROX0c8yWtiWM7ZI6mEPTI7VkSpZw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.24.2.tgz", - "integrity": "sha512-3qAqTewYrCdnOD9Gl9yvPoAoFAVmPJsBvleabvx4bnu1Kt6DrB2OALeRVag7BdWGWLhP1yooeMLEi6r2nYSOjg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.2.tgz", - "integrity": "sha512-ArdGtPHjLqWkqQuoVQ6a5UC5ebdX8INPuJuJNWRe0RGa/YNhVvxeWmCTFQ7LdmNCSUzVZzxAvUznKaYx645Rig==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.2.tgz", - "integrity": "sha512-B6UHHeNnnih8xH6wRKB0mOcJGvjZTww1FV59HqJoTJ5da9LCG6R4SEBt6uPqzlawv1LoEXSS0d4fBlHNWl6iYw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", "cpu": [ "arm" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.2.tgz", - "integrity": "sha512-kr3gqzczJjSAncwOS6i7fpb4dlqcvLidqrX5hpGBIM1wtt0QEVtf4wFaAwVv8QygFU8iWUMYEoJZWuWxyua4GQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.2.tgz", - "integrity": "sha512-TDdHLKCWgPuq9vQcmyLrhg/bgbOvIQ8rtWQK7MRxJ9nvaxKx38NvY7/Lo6cYuEnNHqf6rMqnivOIPIQt6H2AoA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.2.tgz", - "integrity": "sha512-xv9vS648T3X4AxFFZGWeB5Dou8ilsv4VVqJ0+loOIgDO20zIhYfDLkk5xoQiej2RiSQkld9ijF/fhLeonrz2mw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", "cpu": [ "ppc64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.2.tgz", - "integrity": "sha512-tbtXwnofRoTt223WUZYiUnbxhGAOVul/3StZ947U4A5NNjnQJV5irKMm76G0LGItWs6y+SCjUn/Q0WaMLkEskg==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", "cpu": [ "riscv64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.2.tgz", - "integrity": "sha512-gc97UebApwdsSNT3q79glOSPdfwgwj5ELuiyuiMY3pEWMxeVqLGKfpDFoum4ujivzxn6veUPzkGuSYoh5deQ2Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", "cpu": [ "s390x" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.2.tgz", - "integrity": "sha512-jOG/0nXb3z+EM6SioY8RofqqmZ+9NKYvJ6QQaa9Mvd3RQxlH68/jcB/lpyVt4lCiqr04IyaC34NzhUqcXbB5FQ==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.2.tgz", - "integrity": "sha512-XAo7cJec80NWx9LlZFEJQxqKOMz/lX3geWs2iNT5CHIERLFfd90f3RYLLjiCBm1IMaQ4VOX/lTC9lWfzzQm14Q==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.2.tgz", - "integrity": "sha512-A+JAs4+EhsTjnPQvo9XY/DC0ztaws3vfqzrMNMKlwQXuniBKOIIvAAI8M0fBYiTCxQnElYu7mLk7JrhlQ+HeOw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", "cpu": [ "arm64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.2.tgz", - "integrity": "sha512-ZhcrakbqA1SCiJRMKSU64AZcYzlZ/9M5LaYil9QWxx9vLnkQ9Vnkve17Qn4SjlipqIIBFKjBES6Zxhnvh0EAEw==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", "cpu": [ "ia32" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.2.tgz", - "integrity": "sha512-2mLH46K1u3r6uwc95hU+OR9q/ggYMpnS7pSp83Ece1HUQgF9Nh/QwTK5rcgbFnV9j+08yBrU5sA/P0RK2MSBNA==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -16506,12 +16552,13 @@ } }, "node_modules/rollup": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.2.tgz", - "integrity": "sha512-do/DFGq5g6rdDhdpPq5qb2ecoczeK6y+2UAjdJ5trjQJj5f1AiVdLRWRc9A9/fFukfvJRgM0UXzxBIYMovm5ww==", + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.6" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -16521,24 +16568,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.2", - "@rollup/rollup-android-arm64": "4.24.2", - "@rollup/rollup-darwin-arm64": "4.24.2", - "@rollup/rollup-darwin-x64": "4.24.2", - "@rollup/rollup-freebsd-arm64": "4.24.2", - "@rollup/rollup-freebsd-x64": "4.24.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.2", - "@rollup/rollup-linux-arm-musleabihf": "4.24.2", - "@rollup/rollup-linux-arm64-gnu": "4.24.2", - "@rollup/rollup-linux-arm64-musl": "4.24.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.2", - "@rollup/rollup-linux-riscv64-gnu": "4.24.2", - "@rollup/rollup-linux-s390x-gnu": "4.24.2", - "@rollup/rollup-linux-x64-gnu": "4.24.2", - "@rollup/rollup-linux-x64-musl": "4.24.2", - "@rollup/rollup-win32-arm64-msvc": "4.24.2", - "@rollup/rollup-win32-ia32-msvc": "4.24.2", - "@rollup/rollup-win32-x64-msvc": "4.24.2", + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", "fsevents": "~2.3.2" } }, @@ -16564,6 +16613,13 @@ "typescript": "^4.5 || ^5.0" } }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", From 7bbde6eaf18f338efaacc6be64613a717d6effe0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 May 2025 12:10:18 -0400 Subject: [PATCH 27/55] chore(deps): update dependency @rollup/plugin-typescript to v12 (#1059) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
rollup/plugins (@​rollup/plugin-typescript) ### [`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 ([#​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 ([#​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. ([#​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` ([#​1728](https://redirect.github.com/rollup/plugins/issues/1728))
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 11 ++++++----- package.json | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9253cc9c0..7e0f6c94f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "packages/nest" ], "devDependencies": { - "@rollup/plugin-typescript": "^11.1.6", + "@rollup/plugin-typescript": "^12.0.0", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^16.0.0", "@types/jest": "^29.5.12", @@ -4608,10 +4608,11 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "11.1.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", - "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "version": "12.1.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz", + "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" @@ -24150,7 +24151,7 @@ "@nestjs/testing": "^11.0.20", "@openfeature/core": "*", "@openfeature/server-sdk": "1.18.0", - "@types/supertest": "^6.0.3", + "@types/supertest": "^6.0.0", "supertest": "^7.0.0" }, "peerDependencies": { diff --git a/package.json b/package.json index 7de116e56..ad18bb1bd 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "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": "^16.0.0", "@types/jest": "^29.5.12", From 3a3eb8b04ae2a995d8d2d861525ae9792ce0a097 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 May 2025 12:11:42 -0400 Subject: [PATCH 28/55] chore(deps): update dependency esbuild to v0.25.4 (#1185) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
evanw/esbuild (esbuild) ### [`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 ([#​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 ([#​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 ([#​4162](https://redirect.github.com/evanw/esbuild/issues/4162), [#​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 [@​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()` ([#​4141](https://redirect.github.com/evanw/esbuild/issues/4141), [#​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 [@​magic-akari](https://redirect.github.com/magic-akari). - Fix memory leak with `--watch=true` ([#​4131](https://redirect.github.com/evanw/esbuild/issues/4131), [#​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 [@​mxschmitt](https://redirect.github.com/mxschmitt). - More concise output for repeated legal comments ([#​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 ([#​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 ([#​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 ([#​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 ([#​4133](https://redirect.github.com/evanw/esbuild/issues/4133), [#​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.
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 206 +++++++++++++++++++++++----------------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7e0f6c94f..08153421d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2445,9 +2445,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", - "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", "cpu": [ "ppc64" ], @@ -2462,9 +2462,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", - "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", "cpu": [ "arm" ], @@ -2479,9 +2479,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", - "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", "cpu": [ "arm64" ], @@ -2496,9 +2496,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", - "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", "cpu": [ "x64" ], @@ -2513,9 +2513,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", - "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ "arm64" ], @@ -2530,9 +2530,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", - "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", "cpu": [ "x64" ], @@ -2547,9 +2547,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", - "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", "cpu": [ "arm64" ], @@ -2564,9 +2564,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", - "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", "cpu": [ "x64" ], @@ -2581,9 +2581,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", - "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", "cpu": [ "arm" ], @@ -2598,9 +2598,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", - "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", "cpu": [ "arm64" ], @@ -2615,9 +2615,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", - "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", "cpu": [ "ia32" ], @@ -2632,9 +2632,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", - "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", "cpu": [ "loong64" ], @@ -2649,9 +2649,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", - "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", "cpu": [ "mips64el" ], @@ -2666,9 +2666,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", - "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", "cpu": [ "ppc64" ], @@ -2683,9 +2683,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", - "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", "cpu": [ "riscv64" ], @@ -2700,9 +2700,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", - "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", "cpu": [ "s390x" ], @@ -2717,9 +2717,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", - "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", "cpu": [ "x64" ], @@ -2734,9 +2734,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", - "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", "cpu": [ "arm64" ], @@ -2751,9 +2751,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", - "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", "cpu": [ "x64" ], @@ -2768,9 +2768,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", - "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", "cpu": [ "arm64" ], @@ -2785,9 +2785,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", - "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", "cpu": [ "x64" ], @@ -2802,9 +2802,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", - "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", "cpu": [ "x64" ], @@ -2819,9 +2819,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", - "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", "cpu": [ "arm64" ], @@ -2836,9 +2836,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", - "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", "cpu": [ "ia32" ], @@ -2853,9 +2853,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", - "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", "cpu": [ "x64" ], @@ -9268,9 +9268,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", - "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -9281,31 +9281,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.2", - "@esbuild/android-arm": "0.25.2", - "@esbuild/android-arm64": "0.25.2", - "@esbuild/android-x64": "0.25.2", - "@esbuild/darwin-arm64": "0.25.2", - "@esbuild/darwin-x64": "0.25.2", - "@esbuild/freebsd-arm64": "0.25.2", - "@esbuild/freebsd-x64": "0.25.2", - "@esbuild/linux-arm": "0.25.2", - "@esbuild/linux-arm64": "0.25.2", - "@esbuild/linux-ia32": "0.25.2", - "@esbuild/linux-loong64": "0.25.2", - "@esbuild/linux-mips64el": "0.25.2", - "@esbuild/linux-ppc64": "0.25.2", - "@esbuild/linux-riscv64": "0.25.2", - "@esbuild/linux-s390x": "0.25.2", - "@esbuild/linux-x64": "0.25.2", - "@esbuild/netbsd-arm64": "0.25.2", - "@esbuild/netbsd-x64": "0.25.2", - "@esbuild/openbsd-arm64": "0.25.2", - "@esbuild/openbsd-x64": "0.25.2", - "@esbuild/sunos-x64": "0.25.2", - "@esbuild/win32-arm64": "0.25.2", - "@esbuild/win32-ia32": "0.25.2", - "@esbuild/win32-x64": "0.25.2" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/esbuild-wasm": { From fadecb1645254afe0a3ff9aefc489ced93eef139 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 May 2025 16:10:34 +0000 Subject: [PATCH 29/55] chore(deps): update dependency @types/node to v22.15.17 (#1190) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 08153421d..201678955 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5507,9 +5507,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", "dev": true, "license": "MIT", "dependencies": { From 9c5f14d9f24de3a1be150790cfedd8ecc57327bc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 15 May 2025 16:11:58 +0000 Subject: [PATCH 30/55] chore(deps): update dependency eslint-plugin-jsdoc to v50.6.14 (#1191) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc) ### [`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 ([#​1385](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1385)) ([0a30832](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/0a30832b41b259f3b950de0000b912166c683cb4)) ### [`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 '&' ([#​1383](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1383)) ([19fa3dc](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/19fa3dcb321d2420998c205bfc6ca501a78dc090)), closes [#​1379](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1379) [#​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 [#​1373](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1373) ([#​1384](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1384)) ([f32989c](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/f32989c2594460808d8cc8e35f6d4347c8c78fc6)) ### [`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 [#​1373](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1373) ([#​1374](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1374)) ([65b0dc0](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/65b0dc0f58b01b6b3338814ca7f627df9b7276da)) ### [`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 [#​1371](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1371) ([#​1372](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1372)) ([6d5c9fb](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/6d5c9fb6505b7d1dd3befdeaa38a98a93c1d1337)) ### [`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` ([#​1366](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1366))" ([#​1367](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1367)) ([771eadf](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/771eadfa447e171d4a33ff2aff9c93d863988ab2)) ### [`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) ([#​1365](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1365)) ([ed62262](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/ed622628fc778ab9c549b3dde179d4a771f23ef4)) ### [`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 [#​178](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/178),[#​1342](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1342) ([1c38930](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/1c38930dd10ac717d632e0aa4e40e1d8a471797a)) ### [`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 [#​670](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/670) ([23b4bfa](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/23b4bfa1a8364e56cbd600f90509e753c54f14be)) ### [`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 [#​1360](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1360) ([6baad05](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/6baad05aabe988bf529b4fe53b0fdeb54e854f31)) ### [`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](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/9edf4b18f97f36b12f11441828f9b623f6a560b3)) - force release ([b08733a](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/b08733a127d82b09461a18f5c31bd4533f7c3ee0))
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 67 +++++++++++++---------------------------------- 1 file changed, 18 insertions(+), 49 deletions(-) diff --git a/package-lock.json b/package-lock.json index 201678955..a6c308688 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4551,18 +4551,6 @@ "node": ">=14" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, "node_modules/@rollup/plugin-json": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", @@ -9614,9 +9602,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.6.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.3.tgz", - "integrity": "sha512-NxbJyt1M5zffPcYZ8Nb53/8nnbIScmiLAMdoe0/FAszwb7lcSiX3iYBTsuF7RV84dZZJC8r3NghomrUXsmWvxQ==", + "version": "50.6.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.14.tgz", + "integrity": "sha512-JUudvooQbUx3iB8n/MzXMOV/VtaXq7xL4CeXhYryinr8osck7nV6fE2/xUXTiH3epPXcvq6TE3HQfGQuRHErTQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -9627,10 +9615,9 @@ "escape-string-regexp": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.6.0", - "parse-imports": "^2.1.1", + "parse-imports-exports": "^0.2.4", "semver": "^7.6.3", - "spdx-expression-parse": "^4.0.0", - "synckit": "^0.9.1" + "spdx-expression-parse": "^4.0.0" }, "engines": { "node": ">=18" @@ -15398,17 +15385,14 @@ "node": ">=6" } }, - "node_modules/parse-imports": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", - "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", "dev": true, + "license": "MIT", "dependencies": { - "es-module-lexer": "^1.5.3", - "slashes": "^3.0.12" - }, - "engines": { - "node": ">= 18" + "parse-statements": "1.0.11" } }, "node_modules/parse-json": { @@ -15438,6 +15422,13 @@ "node": ">= 0.10" } }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/parse5": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", @@ -17241,12 +17232,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/slashes": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", - "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==", - "dev": true - }, "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", @@ -17856,22 +17841,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", From b03c27c3b82e4ebe01962ab9c6aa7110810652a0 Mon Sep 17 00:00:00 2001 From: Lukas Reining Date: Sun, 25 May 2025 11:59:53 +0200 Subject: [PATCH 31/55] fix(angular): add license and url field to package.json Signed-off-by: Lukas Reining Signed-off-by: Weyert de Boer --- packages/angular/projects/angular-sdk/package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/angular/projects/angular-sdk/package.json b/packages/angular/projects/angular-sdk/package.json index b0b4ad17b..952ddb45c 100644 --- a/packages/angular/projects/angular-sdk/package.json +++ b/packages/angular/projects/angular-sdk/package.json @@ -6,6 +6,11 @@ "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", From ba2c761b2f1376b2e52444fcd22565d7409b0b4b Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Sun, 25 May 2025 06:07:48 -0400 Subject: [PATCH 32/55] chore(main): release angular-sdk 0.0.14 (#1178) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](https://github.com/open-feature/js-sdk/commit/b2784f53b85a11c58abb8e2a0f87a31890885c54)) ### 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 Co-authored-by: Lukas Reining Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/angular/projects/angular-sdk/CHANGELOG.md | 8 ++++++++ packages/angular/projects/angular-sdk/README.md | 4 ++-- packages/angular/projects/angular-sdk/package.json | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index b348166a2..def263359 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -5,5 +5,5 @@ "packages/web": "1.5.0", "packages/server": "1.18.0", "packages/shared": "1.8.0", - "packages/angular/projects/angular-sdk": "0.0.13" + "packages/angular/projects/angular-sdk": "0.0.14" } diff --git a/packages/angular/projects/angular-sdk/CHANGELOG.md b/packages/angular/projects/angular-sdk/CHANGELOG.md index 60a4afcb9..68618ae63 100644 --- a/packages/angular/projects/angular-sdk/CHANGELOG.md +++ b/packages/angular/projects/angular-sdk/CHANGELOG.md @@ -1,6 +1,14 @@ # Changelog +## [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) diff --git a/packages/angular/projects/angular-sdk/README.md b/packages/angular/projects/angular-sdk/README.md index 15fb5066f..a366a7962 100644 --- a/packages/angular/projects/angular-sdk/README.md +++ b/packages/angular/projects/angular-sdk/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/angular/projects/angular-sdk/package.json b/packages/angular/projects/angular-sdk/package.json index 952ddb45c..983a7d8ae 100644 --- a/packages/angular/projects/angular-sdk/package.json +++ b/packages/angular/projects/angular-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/angular-sdk", - "version": "0.0.13", + "version": "0.0.14", "description": "OpenFeature Angular SDK", "repository": { "type": "git", From 4e335ac83d47954e4032b85c149382dc5ea413e9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 19:53:11 +0200 Subject: [PATCH 33/55] chore(deps): update dependency rxjs to v7.8.2 (#1193) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
reactivex/rxjs (rxjs) ### [`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)
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 60 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6c308688..d75cc893e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -156,6 +156,16 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/schematics": { "version": "19.2.7", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.7.tgz", @@ -247,6 +257,16 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-eslint/builder": { "version": "19.3.0", "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-19.3.0.tgz", @@ -324,6 +344,16 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@angular-eslint/builder/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-eslint/bundled-angular-compiler": { "version": "19.3.0", "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-19.3.0.tgz", @@ -464,6 +494,16 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@angular-eslint/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-eslint/schematics/node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", @@ -16673,9 +16713,10 @@ } }, "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } @@ -23559,6 +23600,16 @@ "fsevents": "~2.3.2" } }, + "packages/angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "packages/angular/node_modules/sass": { "version": "1.80.7", "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz", @@ -24093,7 +24144,8 @@ }, "packages/angular/projects/angular-sdk": { "name": "@openfeature/angular-sdk", - "version": "0.0.13", + "version": "0.0.14", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.3.0" }, From 7d2fb3ac49bac00b958cd27d9a99ccca044dfa34 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 19:57:01 +0200 Subject: [PATCH 34/55] chore(deps): update dependency jest-preset-angular to v14.5.5 (#1192) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
thymikee/jest-preset-angular (jest-preset-angular) ### [`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` ([#​3029](https://redirect.github.com/thymikee/jest-preset-angular/issues/3029)) ([51db8f4](https://redirect.github.com/thymikee/jest-preset-angular/commit/51db8f4)), closes [#​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 [#​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 [#​2913](https://redirect.github.com/thymikee/jest-preset-angular/issues/2913)
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index d75cc893e..dd4559323 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12573,9 +12573,9 @@ } }, "node_modules/jest-preset-angular": { - "version": "14.5.1", - "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.5.1.tgz", - "integrity": "sha512-HLYYMwNcv3mFrKbOPJwR29tKqVg+yWxez8ilCIsEj1HRYZ/OVsBy5+dcMok+VqL5nmeukTsGnEfGWt+SsQqtkA==", + "version": "14.5.5", + "resolved": "https://registry.npmjs.org/jest-preset-angular/-/jest-preset-angular-14.5.5.tgz", + "integrity": "sha512-PUykbixXEYSltKQE4450YuBiO8SMo2SwdGRHAdArRuV06Igq8gaLRVt9j8suj/4qtm2xRqoKnh5j52R0PfQxFw==", "dev": true, "license": "MIT", "dependencies": { @@ -12584,7 +12584,7 @@ "jest-environment-jsdom": "^29.7.0", "jest-util": "^29.7.0", "pretty-format": "^29.7.0", - "ts-jest": "^29.0.0" + "ts-jest": "^29.3.0" }, "engines": { "node": "^14.15.0 || >=16.10.0" @@ -18252,10 +18252,11 @@ } }, "node_modules/ts-jest": { - "version": "29.2.5", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.2.5.tgz", - "integrity": "sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==", + "version": "29.3.4", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.3.4.tgz", + "integrity": "sha512-Iqbrm8IXOmV+ggWHOTEbjwyCf2xZlUMv5npExksXohL+tk8va4Fjhb+X2+Rt9NBmgO7bJ8WpnMLOwih/DnMlFA==", "dev": true, + "license": "MIT", "dependencies": { "bs-logger": "^0.2.6", "ejs": "^3.1.10", @@ -18264,7 +18265,8 @@ "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", - "semver": "^7.6.3", + "semver": "^7.7.2", + "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, "bin": { @@ -18299,6 +18301,32 @@ } } }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", From 5e276c9c4cef7431e4abae6df9462ac2093498aa Mon Sep 17 00:00:00 2001 From: Lukas Reining Date: Tue, 27 May 2025 22:50:11 +0200 Subject: [PATCH 35/55] fix(angular): update docs (#1200) Signed-off-by: Lukas Reining Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 1 - packages/angular/projects/angular-sdk/README.md | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index def263359..631974814 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,7 +1,6 @@ { "packages/nest": "0.2.4", "packages/react": "1.0.0", - "packages/angular": "0.0.1-experimental", "packages/web": "1.5.0", "packages/server": "1.18.0", "packages/shared": "1.8.0", diff --git a/packages/angular/projects/angular-sdk/README.md b/packages/angular/projects/angular-sdk/README.md index a366a7962..cfa2b6a3d 100644 --- a/packages/angular/projects/angular-sdk/README.md +++ b/packages/angular/projects/angular-sdk/README.md @@ -114,7 +114,7 @@ import { OpenFeatureModule } from '@openfeature/angular-sdk'; CommonModule, OpenFeatureModule.forRoot({ provider: yourFeatureProvider, - // domainBoundProviders are optional, mostly needed if more than one provider is needed + // domainBoundProviders are optional, mostly needed if more than one provider is used in the application. domainBoundProviders: { domain1: new YourOpenFeatureProvider(), domain2: new YourOtherOpenFeatureProvider(), From 81ce66a96d4dddd40a46bebb5086c18e7c161003 Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Tue, 27 May 2025 16:56:32 -0400 Subject: [PATCH 36/55] chore(main): release angular-sdk 0.0.15 (#1201) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](https://github.com/open-feature/js-sdk/commit/b6ea5884f2ab9f4f94c8b258c4cf7268ea6dbeb8)) ### 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 Co-authored-by: Lukas Reining Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/angular/projects/angular-sdk/CHANGELOG.md | 8 ++++++++ packages/angular/projects/angular-sdk/README.md | 4 ++-- packages/angular/projects/angular-sdk/package.json | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 631974814..58adc506d 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -4,5 +4,5 @@ "packages/web": "1.5.0", "packages/server": "1.18.0", "packages/shared": "1.8.0", - "packages/angular/projects/angular-sdk": "0.0.14" + "packages/angular/projects/angular-sdk": "0.0.15" } diff --git a/packages/angular/projects/angular-sdk/CHANGELOG.md b/packages/angular/projects/angular-sdk/CHANGELOG.md index 68618ae63..de00fd2bd 100644 --- a/packages/angular/projects/angular-sdk/CHANGELOG.md +++ b/packages/angular/projects/angular-sdk/CHANGELOG.md @@ -1,6 +1,14 @@ # Changelog +## [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) diff --git a/packages/angular/projects/angular-sdk/README.md b/packages/angular/projects/angular-sdk/README.md index cfa2b6a3d..59fabb98a 100644 --- a/packages/angular/projects/angular-sdk/README.md +++ b/packages/angular/projects/angular-sdk/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/angular/projects/angular-sdk/package.json b/packages/angular/projects/angular-sdk/package.json index 983a7d8ae..4928dddbb 100644 --- a/packages/angular/projects/angular-sdk/package.json +++ b/packages/angular/projects/angular-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/angular-sdk", - "version": "0.0.14", + "version": "0.0.15", "description": "OpenFeature Angular SDK", "repository": { "type": "git", From 763c5135514872fef1c26f29953e7bd993159500 Mon Sep 17 00:00:00 2001 From: Lukas Reining Date: Tue, 27 May 2025 23:51:57 +0200 Subject: [PATCH 37/55] 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 Signed-off-by: Weyert de Boer --- .github/workflows/release-please.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index e12eda141..a1b7515d1 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -5,7 +5,6 @@ on: name: Run Release Please jobs: release-please: - environment: publish runs-on: ubuntu-latest # Release-please creates a PR that tracks all changes @@ -55,6 +54,7 @@ jobs: needs: release-please runs-on: ubuntu-latest if: ${{ needs.release-please.outputs.release_created }} + environment: publish permissions: id-token: write contents: write From 461d9dc11087941d629bd6d2d947aa8ddf711816 Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Tue, 27 May 2025 18:08:11 -0400 Subject: [PATCH 38/55] chore(main): release nestjs-sdk 0.2.5 (#1183) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](https://github.com/open-feature/js-sdk/commit/59b8fe904f053e4aa3d0c72631af34183ff54dc7)) --- 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 Co-authored-by: Lukas Reining Signed-off-by: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/nest/CHANGELOG.md | 8 ++++++++ packages/nest/README.md | 4 ++-- packages/nest/package.json | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 58adc506d..543f0d240 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,5 @@ { - "packages/nest": "0.2.4", + "packages/nest": "0.2.5", "packages/react": "1.0.0", "packages/web": "1.5.0", "packages/server": "1.18.0", diff --git a/packages/nest/CHANGELOG.md b/packages/nest/CHANGELOG.md index 074ff604a..9ec9e02e7 100644 --- a/packages/nest/CHANGELOG.md +++ b/packages/nest/CHANGELOG.md @@ -1,5 +1,13 @@ # 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) diff --git a/packages/nest/README.md b/packages/nest/README.md index dfcd0093c..e64743532 100644 --- a/packages/nest/README.md +++ b/packages/nest/README.md @@ -16,8 +16,8 @@ Specification - - Release + + Release
diff --git a/packages/nest/package.json b/packages/nest/package.json index beda65e1b..383eb5c24 100644 --- a/packages/nest/package.json +++ b/packages/nest/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/nestjs-sdk", - "version": "0.2.4", + "version": "0.2.5", "description": "OpenFeature Nest.js SDK", "main": "./dist/cjs/index.js", "files": [ From 4fa96dfb5429d0b557d62fa62cf2e588e27195ce Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Thu, 29 May 2025 15:38:31 -0400 Subject: [PATCH 39/55] chore: update node to v20+ (#1203) node v18 is now EOL Signed-off-by: Todd Baert Signed-off-by: Weyert de Boer --- .github/workflows/pr-checks.yaml | 7 +++---- package.json | 3 --- packages/server/package.json | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/.github/workflows/pr-checks.yaml b/.github/workflows/pr-checks.yaml index 9875e77bc..800be6d5c 100644 --- a/.github/workflows/pr-checks.yaml +++ b/.github/workflows/pr-checks.yaml @@ -16,9 +16,9 @@ jobs: strategy: matrix: node-version: - - 18.x - 20.x - 22.x + - 24.x steps: - uses: actions/checkout@v4 @@ -47,7 +47,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: 'npm' - name: Install @@ -69,8 +69,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 diff --git a/package.json b/package.json index ad18bb1bd..e72417208 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,6 @@ "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": "^12.0.0", "@testing-library/jest-dom": "^6.4.2", diff --git a/packages/server/package.json b/packages/server/package.json index 8e039cfdc..7cf906174 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -45,7 +45,7 @@ }, "homepage": "https://github.com/open-feature/js-sdk#readme", "engines": { - "node": ">=18" + "node": ">=20" }, "peerDependencies": { "@openfeature/core": "^1.7.0" From d92ffcd5d345e42c15dcdb9722269c1dcec1ae09 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 16:45:45 -0400 Subject: [PATCH 40/55] chore(deps): update dependency prettier to v3.5.3 (#1195) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
prettier/prettier (prettier) ### [`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 ([#​17156](https://redirect.github.com/prettier/prettier/pull/17156) by [@​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 ([#​17100](https://redirect.github.com/prettier/prettier/pull/17100) by [@​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 ([#​17101](https://redirect.github.com/prettier/prettier/pull/17101) by [@​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)
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index dd4559323..1d29d2b32 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,9 +54,6 @@ "typedoc": "^0.26.0", "typescript": "^4.7.4", "uuid": "^11.0.0" - }, - "engines": { - "node": ">=18" } }, "node_modules/@adobe/css-tools": { @@ -15908,9 +15905,9 @@ } }, "node_modules/prettier": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", - "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", "bin": { @@ -24172,7 +24169,7 @@ }, "packages/angular/projects/angular-sdk": { "name": "@openfeature/angular-sdk", - "version": "0.0.14", + "version": "0.0.15", "license": "Apache-2.0", "dependencies": { "tslib": "^2.3.0" @@ -24191,7 +24188,7 @@ }, "packages/nest": { "name": "@openfeature/nestjs-sdk", - "version": "0.2.4", + "version": "0.2.5", "license": "Apache-2.0", "devDependencies": { "@nestjs/common": "^11.0.20", @@ -24686,7 +24683,7 @@ "@openfeature/core": "^1.7.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "peerDependencies": { "@openfeature/core": "^1.7.0" From 5c1b3d6858f629fc3fa9564b96f6ef8d09214b09 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 30 May 2025 16:46:03 -0400 Subject: [PATCH 41/55] chore(deps): update dependency @types/node to v22.15.23 (#1198) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1d29d2b32..9f2269bd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5532,9 +5532,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.15.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", - "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", + "version": "22.15.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.23.tgz", + "integrity": "sha512-7Ec1zaFPF4RJ0eXu1YT/xgiebqwqoJz8rYPDi/O2BcZ++Wpt0Kq9cl0eg6NN6bYbPnR67ZLo7St5Q3UK0SnARw==", "dev": true, "license": "MIT", "dependencies": { From b475a6ebf9b6fad93464294004a264fe8fbe8dca Mon Sep 17 00:00:00 2001 From: Michael Beemer Date: Tue, 3 Jun 2025 09:51:28 -0400 Subject: [PATCH 42/55] 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 Signed-off-by: Weyert de Boer --- packages/shared/src/evaluation/evaluation.ts | 2 +- packages/shared/src/telemetry/attributes.ts | 31 ++++++++++++------- .../shared/src/telemetry/evaluation-data.ts | 17 ---------- .../shared/src/telemetry/evaluation-event.ts | 17 +++++----- packages/shared/src/telemetry/index.ts | 1 - packages/shared/test/telemetry.spec.ts | 8 ++--- 6 files changed, 34 insertions(+), 42 deletions(-) delete mode 100644 packages/shared/src/telemetry/evaluation-data.ts diff --git a/packages/shared/src/evaluation/evaluation.ts b/packages/shared/src/evaluation/evaluation.ts index 895a1ddcc..78e7b65cb 100644 --- a/packages/shared/src/evaluation/evaluation.ts +++ b/packages/shared/src/evaluation/evaluation.ts @@ -3,7 +3,7 @@ import type { JsonValue } from '../types/structure'; export type FlagValueType = 'boolean' | 'string' | 'number' | 'object'; /** - * Represents a JSON node value, or Date. + * Represents a JSON node value. */ export type FlagValue = boolean | string | number | JsonValue; diff --git a/packages/shared/src/telemetry/attributes.ts b/packages/shared/src/telemetry/attributes.ts index 320e24881..c61808456 100644 --- a/packages/shared/src/telemetry/attributes.ts +++ b/packages/shared/src/telemetry/attributes.ts @@ -20,6 +20,14 @@ export const TelemetryAttribute = { * - example: `flag_not_found` */ ERROR_CODE: 'error.type', + /** + * A message explaining the nature of an error occurring during flag evaluation. + * + * - type: `string` + * - requirement level: `recommended` + * - example: `Flag not found` + */ + ERROR_MESSAGE: 'error.message', /** * A semantic identifier for an evaluated flag value. * @@ -28,23 +36,24 @@ export const TelemetryAttribute = { * - condition: variant is defined on the evaluation details * - example: `blue`; `on`; `true` */ - VARIANT: 'feature_flag.variant', + VARIANT: 'feature_flag.result.variant', /** - * The unique identifier for the flag evaluation context. For example, the targeting key. + * The evaluated value of the feature flag. * - * - type: `string` - * - requirement level: `recommended` - * - example: `5157782b-2203-4c80-a857-dbbd5e7761db` + * - type: `undefined` + * - requirement level: `conditionally required` + * - condition: variant is not defined on the evaluation details + * - example: `#ff0000`; `1`; `true` */ - CONTEXT_ID: 'feature_flag.context.id', + VALUE: 'feature_flag.result.value', /** - * A message explaining the nature of an error occurring during flag evaluation. + * The unique identifier for the flag evaluation context. For example, the targeting key. * * - type: `string` * - requirement level: `recommended` - * - example: `Flag not found` + * - example: `5157782b-2203-4c80-a857-dbbd5e7761db` */ - ERROR_MESSAGE: 'feature_flag.evaluation.error.message', + CONTEXT_ID: 'feature_flag.context.id', /** * The reason code which shows how a feature flag value was determined. * @@ -52,7 +61,7 @@ export const TelemetryAttribute = { * - requirement level: `recommended` * - example: `targeting_match` */ - REASON: 'feature_flag.evaluation.reason', + REASON: 'feature_flag.result.reason', /** * Describes a class of error the operation ended with. * @@ -60,7 +69,7 @@ export const TelemetryAttribute = { * - requirement level: `recommended` * - example: `flag_not_found` */ - PROVIDER: 'feature_flag.provider_name', + PROVIDER: 'feature_flag.provider.name', /** * The identifier of the flag set to which the feature flag belongs. * diff --git a/packages/shared/src/telemetry/evaluation-data.ts b/packages/shared/src/telemetry/evaluation-data.ts deleted file mode 100644 index ef0b5f6ab..000000000 --- a/packages/shared/src/telemetry/evaluation-data.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Event data, sometimes referred as "body", is specific to a specific event. - * In this case, the event is `feature_flag.evaluation`. That's why the prefix - * is omitted from the values. - * @see https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-logs/ - */ -export const TelemetryEvaluationData = { - /** - * The evaluated value of the feature flag. - * - * - type: `undefined` - * - requirement level: `conditionally required` - * - condition: variant is not defined on the evaluation details - * - example: `#ff0000`; `1`; `true` - */ - VALUE: 'value', -} as const; diff --git a/packages/shared/src/telemetry/evaluation-event.ts b/packages/shared/src/telemetry/evaluation-event.ts index 3ee1630d7..81a85aad2 100644 --- a/packages/shared/src/telemetry/evaluation-event.ts +++ b/packages/shared/src/telemetry/evaluation-event.ts @@ -1,14 +1,19 @@ import { ErrorCode, StandardResolutionReasons, type EvaluationDetails, type FlagValue } from '../evaluation/evaluation'; import type { HookContext } from '../hooks/hooks'; -import type { JsonValue } from '../types'; import { TelemetryAttribute } from './attributes'; -import { TelemetryEvaluationData } from './evaluation-data'; import { TelemetryFlagMetadata } from './flag-metadata'; type EvaluationEvent = { + /** + * The name of the feature flag evaluation event. + */ name: string; - attributes: Record; - body: Record; + /** + * The attributes of an OpenTelemetry compliant event for flag evaluation. + * @experimental The attributes are subject to change. + * @see https://opentelemetry.io/docs/specs/semconv/feature-flags/feature-flags-logs/ + */ + attributes: Record; }; const FLAG_EVALUATION_EVENT_NAME = 'feature_flag.evaluation'; @@ -28,12 +33,11 @@ export function createEvaluationEvent( [TelemetryAttribute.PROVIDER]: hookContext.providerMetadata.name, [TelemetryAttribute.REASON]: (evaluationDetails.reason ?? StandardResolutionReasons.UNKNOWN).toLowerCase(), }; - const body: EvaluationEvent['body'] = {}; if (evaluationDetails.variant) { attributes[TelemetryAttribute.VARIANT] = evaluationDetails.variant; } else { - body[TelemetryEvaluationData.VALUE] = evaluationDetails.value; + attributes[TelemetryAttribute.VALUE] = evaluationDetails.value; } const contextId = @@ -62,6 +66,5 @@ export function createEvaluationEvent( return { name: FLAG_EVALUATION_EVENT_NAME, attributes, - body, }; } diff --git a/packages/shared/src/telemetry/index.ts b/packages/shared/src/telemetry/index.ts index f77746305..2f1561707 100644 --- a/packages/shared/src/telemetry/index.ts +++ b/packages/shared/src/telemetry/index.ts @@ -1,4 +1,3 @@ export * from './attributes'; -export * from './evaluation-data'; export * from './flag-metadata'; export * from './evaluation-event'; diff --git a/packages/shared/test/telemetry.spec.ts b/packages/shared/test/telemetry.spec.ts index 62d9871cf..35cbe7917 100644 --- a/packages/shared/test/telemetry.spec.ts +++ b/packages/shared/test/telemetry.spec.ts @@ -1,7 +1,7 @@ import { createEvaluationEvent } from '../src/telemetry/evaluation-event'; import { ErrorCode, StandardResolutionReasons, type EvaluationDetails } from '../src/evaluation/evaluation'; import type { HookContext } from '../src/hooks/hooks'; -import { TelemetryAttribute, TelemetryFlagMetadata, TelemetryEvaluationData } from '../src/telemetry'; +import { TelemetryAttribute, TelemetryFlagMetadata } from '../src/telemetry'; describe('evaluationEvent', () => { const flagKey = 'test-flag'; @@ -43,9 +43,7 @@ describe('evaluationEvent', () => { [TelemetryAttribute.PROVIDER]: 'test-provider', [TelemetryAttribute.REASON]: StandardResolutionReasons.STATIC.toLowerCase(), [TelemetryAttribute.CONTEXT_ID]: 'test-target', - }); - expect(result.body).toEqual({ - [TelemetryEvaluationData.VALUE]: true, + [TelemetryAttribute.VALUE]: true, }); }); @@ -61,7 +59,7 @@ describe('evaluationEvent', () => { const result = createEvaluationEvent(mockHookContext, details); expect(result.attributes[TelemetryAttribute.VARIANT]).toBe('test-variant'); - expect(result.attributes[TelemetryEvaluationData.VALUE]).toBeUndefined(); + expect(result.attributes[TelemetryAttribute.VALUE]).toBeUndefined(); }); it('should include flag metadata when provided', () => { From 7f95d1e10f10812e50e9221acbad933d631d46e2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 12:33:54 -0400 Subject: [PATCH 43/55] chore(deps): update dependency esbuild to v0.25.5 (#1204) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
evanw/esbuild (esbuild) ### [`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` ([#​4187](https://redirect.github.com/evanw/esbuild/issues/4187)) The fix to [#​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 ([#​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 ([#​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; } ```
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 206 +++++++++++++++++++++++----------------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9f2269bd6..3064396a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2482,9 +2482,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz", + "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==", "cpu": [ "ppc64" ], @@ -2499,9 +2499,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz", + "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==", "cpu": [ "arm" ], @@ -2516,9 +2516,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz", + "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==", "cpu": [ "arm64" ], @@ -2533,9 +2533,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz", + "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==", "cpu": [ "x64" ], @@ -2550,9 +2550,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz", + "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==", "cpu": [ "arm64" ], @@ -2567,9 +2567,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz", + "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==", "cpu": [ "x64" ], @@ -2584,9 +2584,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz", + "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==", "cpu": [ "arm64" ], @@ -2601,9 +2601,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz", + "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==", "cpu": [ "x64" ], @@ -2618,9 +2618,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz", + "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==", "cpu": [ "arm" ], @@ -2635,9 +2635,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz", + "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==", "cpu": [ "arm64" ], @@ -2652,9 +2652,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz", + "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==", "cpu": [ "ia32" ], @@ -2669,9 +2669,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz", + "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==", "cpu": [ "loong64" ], @@ -2686,9 +2686,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz", + "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==", "cpu": [ "mips64el" ], @@ -2703,9 +2703,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz", + "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==", "cpu": [ "ppc64" ], @@ -2720,9 +2720,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz", + "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==", "cpu": [ "riscv64" ], @@ -2737,9 +2737,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz", + "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==", "cpu": [ "s390x" ], @@ -2754,9 +2754,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz", + "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==", "cpu": [ "x64" ], @@ -2771,9 +2771,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz", + "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==", "cpu": [ "arm64" ], @@ -2788,9 +2788,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz", + "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==", "cpu": [ "x64" ], @@ -2805,9 +2805,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz", + "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==", "cpu": [ "arm64" ], @@ -2822,9 +2822,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz", + "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==", "cpu": [ "x64" ], @@ -2839,9 +2839,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz", + "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==", "cpu": [ "x64" ], @@ -2856,9 +2856,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz", + "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==", "cpu": [ "arm64" ], @@ -2873,9 +2873,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz", + "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==", "cpu": [ "ia32" ], @@ -2890,9 +2890,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz", + "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==", "cpu": [ "x64" ], @@ -9293,9 +9293,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz", + "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -9306,31 +9306,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" + "@esbuild/aix-ppc64": "0.25.5", + "@esbuild/android-arm": "0.25.5", + "@esbuild/android-arm64": "0.25.5", + "@esbuild/android-x64": "0.25.5", + "@esbuild/darwin-arm64": "0.25.5", + "@esbuild/darwin-x64": "0.25.5", + "@esbuild/freebsd-arm64": "0.25.5", + "@esbuild/freebsd-x64": "0.25.5", + "@esbuild/linux-arm": "0.25.5", + "@esbuild/linux-arm64": "0.25.5", + "@esbuild/linux-ia32": "0.25.5", + "@esbuild/linux-loong64": "0.25.5", + "@esbuild/linux-mips64el": "0.25.5", + "@esbuild/linux-ppc64": "0.25.5", + "@esbuild/linux-riscv64": "0.25.5", + "@esbuild/linux-s390x": "0.25.5", + "@esbuild/linux-x64": "0.25.5", + "@esbuild/netbsd-arm64": "0.25.5", + "@esbuild/netbsd-x64": "0.25.5", + "@esbuild/openbsd-arm64": "0.25.5", + "@esbuild/openbsd-x64": "0.25.5", + "@esbuild/sunos-x64": "0.25.5", + "@esbuild/win32-arm64": "0.25.5", + "@esbuild/win32-ia32": "0.25.5", + "@esbuild/win32-x64": "0.25.5" } }, "node_modules/esbuild-wasm": { From a806eac71058c8418e7df7d8b78e0a2a713fac9c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:32:59 +0000 Subject: [PATCH 44/55] chore(deps): update dependency rollup to v4.41.1 (#1205) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
rollup/rollup (rollup) ### [`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 ([#​5945](https://redirect.github.com/rollup/rollup/issues/5945)) ##### Pull Requests - [#​5945](https://redirect.github.com/rollup/rollup/pull/5945): Avoid recursively calling a plugin's resolveId hook with same id and importer ([@​younggglcy](https://redirect.github.com/younggglcy), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5963](https://redirect.github.com/rollup/rollup/pull/5963): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5964](https://redirect.github.com/rollup/rollup/pull/5964): fix(deps): lock file maintenance minor/patch updates ([@​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 ([#​5954](https://redirect.github.com/rollup/rollup/issues/5954)) ##### Pull Requests - [#​5949](https://redirect.github.com/rollup/rollup/pull/5949): ci: use node 24 ([@​btea](https://redirect.github.com/btea), [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5951](https://redirect.github.com/rollup/rollup/pull/5951): chore(deps): update dependency pretty-bytes to v7 ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5952](https://redirect.github.com/rollup/rollup/pull/5952): fix(deps): update swc monorepo (major) ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5953](https://redirect.github.com/rollup/rollup/pull/5953): chore(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot]) - [#​5954](https://redirect.github.com/rollup/rollup/pull/5954): enhance tree-shaking for dynamic imports ([@​TrickyPi](https://redirect.github.com/TrickyPi), [@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5957](https://redirect.github.com/rollup/rollup/pull/5957): chore(deps): update dependency lint-staged to v16 ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5958](https://redirect.github.com/rollup/rollup/pull/5958): fix(deps): update rust crate swc_compiler_base to v20 ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5959](https://redirect.github.com/rollup/rollup/pull/5959): fix(deps): lock file maintenance minor/patch updates ([@​renovate](https://redirect.github.com/renovate)\[bot], [@​lukastaegert](https://redirect.github.com/lukastaegert)) - [#​5960](https://redirect.github.com/rollup/rollup/pull/5960): Use spawn to run CLI tests ([@​lukastaegert](https://redirect.github.com/lukastaegert))
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 166 +++++++++++++++++++++++----------------------- 1 file changed, 83 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3064396a5..560ec32b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4682,9 +4682,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", - "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.1.tgz", + "integrity": "sha512-NELNvyEWZ6R9QMkiytB4/L4zSEaBC03KIXEghptLGLZWJ6VPrL63ooZQCOnlx36aQPGhzuOMwDerC1Eb2VmrLw==", "cpu": [ "arm" ], @@ -4696,9 +4696,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", - "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.1.tgz", + "integrity": "sha512-DXdQe1BJ6TK47ukAoZLehRHhfKnKg9BjnQYUu9gzhI8Mwa1d2fzxA1aw2JixHVl403bwp1+/o/NhhHtxWJBgEA==", "cpu": [ "arm64" ], @@ -4710,9 +4710,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", - "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.1.tgz", + "integrity": "sha512-5afxvwszzdulsU2w8JKWwY8/sJOLPzf0e1bFuvcW5h9zsEg+RQAojdW0ux2zyYAz7R8HvvzKCjLNJhVq965U7w==", "cpu": [ "arm64" ], @@ -4724,9 +4724,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", - "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.1.tgz", + "integrity": "sha512-egpJACny8QOdHNNMZKf8xY0Is6gIMz+tuqXlusxquWu3F833DcMwmGM7WlvCO9sB3OsPjdC4U0wHw5FabzCGZg==", "cpu": [ "x64" ], @@ -4738,9 +4738,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", - "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.1.tgz", + "integrity": "sha512-DBVMZH5vbjgRk3r0OzgjS38z+atlupJ7xfKIDJdZZL6sM6wjfDNo64aowcLPKIx7LMQi8vybB56uh1Ftck/Atg==", "cpu": [ "arm64" ], @@ -4752,9 +4752,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", - "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.1.tgz", + "integrity": "sha512-3FkydeohozEskBxNWEIbPfOE0aqQgB6ttTkJ159uWOFn42VLyfAiyD9UK5mhu+ItWzft60DycIN1Xdgiy8o/SA==", "cpu": [ "x64" ], @@ -4766,9 +4766,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", - "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.1.tgz", + "integrity": "sha512-wC53ZNDgt0pqx5xCAgNunkTzFE8GTgdZ9EwYGVcg+jEjJdZGtq9xPjDnFgfFozQI/Xm1mh+D9YlYtl+ueswNEg==", "cpu": [ "arm" ], @@ -4780,9 +4780,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", - "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.1.tgz", + "integrity": "sha512-jwKCca1gbZkZLhLRtsrka5N8sFAaxrGz/7wRJ8Wwvq3jug7toO21vWlViihG85ei7uJTpzbXZRcORotE+xyrLA==", "cpu": [ "arm" ], @@ -4794,9 +4794,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", - "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.1.tgz", + "integrity": "sha512-g0UBcNknsmmNQ8V2d/zD2P7WWfJKU0F1nu0k5pW4rvdb+BIqMm8ToluW/eeRmxCared5dD76lS04uL4UaNgpNA==", "cpu": [ "arm64" ], @@ -4808,9 +4808,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", - "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.1.tgz", + "integrity": "sha512-XZpeGB5TKEZWzIrj7sXr+BEaSgo/ma/kCgrZgL0oo5qdB1JlTzIYQKel/RmhT6vMAvOdM2teYlAaOGJpJ9lahg==", "cpu": [ "arm64" ], @@ -4822,9 +4822,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", - "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.1.tgz", + "integrity": "sha512-bkCfDJ4qzWfFRCNt5RVV4DOw6KEgFTUZi2r2RuYhGWC8WhCA8lCAJhDeAmrM/fdiAH54m0mA0Vk2FGRPyzI+tw==", "cpu": [ "loong64" ], @@ -4836,9 +4836,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", - "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.1.tgz", + "integrity": "sha512-3mr3Xm+gvMX+/8EKogIZSIEF0WUu0HL9di+YWlJpO8CQBnoLAEL/roTCxuLncEdgcfJcvA4UMOf+2dnjl4Ut1A==", "cpu": [ "ppc64" ], @@ -4850,9 +4850,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", - "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.1.tgz", + "integrity": "sha512-3rwCIh6MQ1LGrvKJitQjZFuQnT2wxfU+ivhNBzmxXTXPllewOF7JR1s2vMX/tWtUYFgphygxjqMl76q4aMotGw==", "cpu": [ "riscv64" ], @@ -4864,9 +4864,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", - "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.1.tgz", + "integrity": "sha512-LdIUOb3gvfmpkgFZuccNa2uYiqtgZAz3PTzjuM5bH3nvuy9ty6RGc/Q0+HDFrHrizJGVpjnTZ1yS5TNNjFlklw==", "cpu": [ "riscv64" ], @@ -4878,9 +4878,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", - "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.1.tgz", + "integrity": "sha512-oIE6M8WC9ma6xYqjvPhzZYk6NbobIURvP/lEbh7FWplcMO6gn7MM2yHKA1eC/GvYwzNKK/1LYgqzdkZ8YFxR8g==", "cpu": [ "s390x" ], @@ -4892,9 +4892,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", - "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.1.tgz", + "integrity": "sha512-cWBOvayNvA+SyeQMp79BHPK8ws6sHSsYnK5zDcsC3Hsxr1dgTABKjMnMslPq1DvZIp6uO7kIWhiGwaTdR4Og9A==", "cpu": [ "x64" ], @@ -4906,9 +4906,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", - "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.1.tgz", + "integrity": "sha512-y5CbN44M+pUCdGDlZFzGGBSKCA4A/J2ZH4edTYSSxFg7ce1Xt3GtydbVKWLlzL+INfFIZAEg1ZV6hh9+QQf9YQ==", "cpu": [ "x64" ], @@ -4920,9 +4920,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", - "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.1.tgz", + "integrity": "sha512-lZkCxIrjlJlMt1dLO/FbpZbzt6J/A8p4DnqzSa4PWqPEUUUnzXLeki/iyPLfV0BmHItlYgHUqJe+3KiyydmiNQ==", "cpu": [ "arm64" ], @@ -4934,9 +4934,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", - "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.1.tgz", + "integrity": "sha512-+psFT9+pIh2iuGsxFYYa/LhS5MFKmuivRsx9iPJWNSGbh2XVEjk90fmpUEjCnILPEPJnikAU6SFDiEUyOv90Pg==", "cpu": [ "ia32" ], @@ -4948,9 +4948,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", - "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.1.tgz", + "integrity": "sha512-Wq2zpapRYLfi4aKxf2Xff0tN+7slj2d4R87WEzqw7ZLsVvO5zwYCIuEGSZYiK41+GlwUo1HiR+GdkLEJnCKTCw==", "cpu": [ "x64" ], @@ -16581,9 +16581,9 @@ } }, "node_modules/rollup": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", - "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", + "version": "4.41.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.1.tgz", + "integrity": "sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==", "dev": true, "license": "MIT", "dependencies": { @@ -16597,26 +16597,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.2", - "@rollup/rollup-android-arm64": "4.40.2", - "@rollup/rollup-darwin-arm64": "4.40.2", - "@rollup/rollup-darwin-x64": "4.40.2", - "@rollup/rollup-freebsd-arm64": "4.40.2", - "@rollup/rollup-freebsd-x64": "4.40.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", - "@rollup/rollup-linux-arm-musleabihf": "4.40.2", - "@rollup/rollup-linux-arm64-gnu": "4.40.2", - "@rollup/rollup-linux-arm64-musl": "4.40.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-musl": "4.40.2", - "@rollup/rollup-linux-s390x-gnu": "4.40.2", - "@rollup/rollup-linux-x64-gnu": "4.40.2", - "@rollup/rollup-linux-x64-musl": "4.40.2", - "@rollup/rollup-win32-arm64-msvc": "4.40.2", - "@rollup/rollup-win32-ia32-msvc": "4.40.2", - "@rollup/rollup-win32-x64-msvc": "4.40.2", + "@rollup/rollup-android-arm-eabi": "4.41.1", + "@rollup/rollup-android-arm64": "4.41.1", + "@rollup/rollup-darwin-arm64": "4.41.1", + "@rollup/rollup-darwin-x64": "4.41.1", + "@rollup/rollup-freebsd-arm64": "4.41.1", + "@rollup/rollup-freebsd-x64": "4.41.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.1", + "@rollup/rollup-linux-arm-musleabihf": "4.41.1", + "@rollup/rollup-linux-arm64-gnu": "4.41.1", + "@rollup/rollup-linux-arm64-musl": "4.41.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-gnu": "4.41.1", + "@rollup/rollup-linux-riscv64-musl": "4.41.1", + "@rollup/rollup-linux-s390x-gnu": "4.41.1", + "@rollup/rollup-linux-x64-gnu": "4.41.1", + "@rollup/rollup-linux-x64-musl": "4.41.1", + "@rollup/rollup-win32-arm64-msvc": "4.41.1", + "@rollup/rollup-win32-ia32-msvc": "4.41.1", + "@rollup/rollup-win32-x64-msvc": "4.41.1", "fsevents": "~2.3.2" } }, From 035e377e9888995105e57978e1f299232cd57fa9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:34:07 +0000 Subject: [PATCH 45/55] chore(deps): update dependency eslint-plugin-jsdoc to v50.7.0 (#1199) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc) ### [`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 ([#​1392](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1392)) ([0adbf43](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/0adbf43b6b9f3e24422e100571ed66dd04f169be)) ### [`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 [#​1386](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1386) ([#​1389](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1389)) ([e26a11a](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/e26a11a39930ebd07f61e509d91e6cb87f017dde)) ### [`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) {[@​link](https://redirect.github.com/link) SomeType}`; fixes [#​1381](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1381) ([#​1382](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1382)) ([2bd7242](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/2bd72429015352b383f5bfc22a937afaac4a3b48)) ### [`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 [#​1387](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1387) ([#​1388](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1388)) ([1bef636](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/1bef63677e385234a01316b6cfa9377023c10c15))
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 56 +++++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/package-lock.json b/package-lock.json index 560ec32b3..04b6f5620 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2468,17 +2468,20 @@ } }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.49.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", - "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", + "version": "0.50.2", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.50.2.tgz", + "integrity": "sha512-YAdE/IJSpwbOTiaURNCKECdAwqrJuFiZhylmesBcIRawtYKnBR2wxPhoIewMg+Yu+QuYvHfJNReWpoxGBKOChA==", "dev": true, + "license": "MIT", "dependencies": { + "@types/estree": "^1.0.6", + "@typescript-eslint/types": "^8.11.0", "comment-parser": "1.4.1", "esquery": "^1.6.0", "jsdoc-type-pratt-parser": "~4.1.0" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@esbuild/aix-ppc64": { @@ -6825,12 +6828,13 @@ "dev": true }, "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.1.0.tgz", + "integrity": "sha512-CplVvB5za1z5Zn528h0EUogt/McTT7lvHZKFtb2NYldodL7G3u2O49Mgws3mP/TrKhpNuDjKPHYxmh8t2DGTtQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/arg": { @@ -8618,10 +8622,11 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -9639,21 +9644,21 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.6.14", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.14.tgz", - "integrity": "sha512-JUudvooQbUx3iB8n/MzXMOV/VtaXq7xL4CeXhYryinr8osck7nV6fE2/xUXTiH3epPXcvq6TE3HQfGQuRHErTQ==", + "version": "50.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.7.0.tgz", + "integrity": "sha512-fMeHWVtdxXvLfMmKLXJWObJSt57zBz31RCLZYj3bLSHBqnEsyO50N1OLDi5XP5wh+Gte5van9WTtOnemKAZrSw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "@es-joy/jsdoccomment": "~0.49.0", - "are-docs-informative": "^0.0.2", + "@es-joy/jsdoccomment": "~0.50.2", + "are-docs-informative": "^0.1.0", "comment-parser": "1.4.1", - "debug": "^4.3.6", + "debug": "^4.4.1", "escape-string-regexp": "^4.0.0", - "espree": "^10.1.0", + "espree": "^10.3.0", "esquery": "^1.6.0", "parse-imports-exports": "^0.2.4", - "semver": "^7.6.3", + "semver": "^7.7.2", "spdx-expression-parse": "^4.0.0" }, "engines": { @@ -9694,6 +9699,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", From ec0cffa0f3cca1ee340d47a5987b8b31c2c4a025 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 16:34:40 +0000 Subject: [PATCH 46/55] chore(deps): update dependency rollup-plugin-dts to v6.2.1 (#1196) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
Swatinem/rollup-plugin-dts (rollup-plugin-dts) ### [`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: - [@​NWYLZW](https://redirect.github.com/NWYLZW) - [@​castarco](https://redirect.github.com/castarco) - [@​hyrious](https://redirect.github.com/hyrious) - [@​andersk](https://redirect.github.com/andersk) - [@​kricsleo](https://redirect.github.com/kricsleo) - [@​alan-agius4](https://redirect.github.com/alan-agius4)
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 46 ++++++++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 04b6f5620..82afc1d5d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -228,16 +228,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@angular-devkit/schematics/node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, "node_modules/@angular-devkit/schematics/node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -735,14 +725,15 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", - "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", + "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -1109,10 +1100,11 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -13612,10 +13604,11 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } @@ -16639,12 +16632,13 @@ } }, "node_modules/rollup-plugin-dts": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.1.1.tgz", - "integrity": "sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-6.2.1.tgz", + "integrity": "sha512-sR3CxYUl7i2CHa0O7bA45mCrgADyAQ0tVtGSqi3yvH28M+eg1+g5d7kQ9hLvEz5dorK3XVsH5L2jwHLQf72DzA==", "dev": true, + "license": "LGPL-3.0-only", "dependencies": { - "magic-string": "^0.30.10" + "magic-string": "^0.30.17" }, "engines": { "node": ">=16" @@ -16653,7 +16647,7 @@ "url": "https://github.com/sponsors/Swatinem" }, "optionalDependencies": { - "@babel/code-frame": "^7.24.2" + "@babel/code-frame": "^7.26.2" }, "peerDependencies": { "rollup": "^3.29.4 || ^4", From f7a18fba84d2808fcfae697f3448597665e9a70a Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Wed, 4 Jun 2025 14:54:45 -0400 Subject: [PATCH 47/55] 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 Signed-off-by: Weyert de Boer --- .github/workflows/audit-pending-releases.yml | 2 +- .github/workflows/coverage.yml | 2 +- .github/workflows/release-please.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/audit-pending-releases.yml b/.github/workflows/audit-pending-releases.yml index 968b32dac..91a10909f 100644 --- a/.github/workflows/audit-pending-releases.yml +++ b/.github/workflows/audit-pending-releases.yml @@ -29,6 +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' diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index 59537d387..9a4aa2f63 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -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 diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index a1b7515d1..0b1c9fff7 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -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 @@ -65,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 From 06fd1e4eebce260ee8ad538d246fe14a4dd2c731 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 18:54:59 +0000 Subject: [PATCH 48/55] chore(deps): update dependency eslint-plugin-jsdoc to v50.7.1 (#1211) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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
gajus/eslint-plugin-jsdoc (eslint-plugin-jsdoc) ### [`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 [#​1393](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1393) ([#​1394](https://redirect.github.com/gajus/eslint-plugin-jsdoc/issues/1394)) ([99cb131](https://redirect.github.com/gajus/eslint-plugin-jsdoc/commit/99cb131ee40fa10f943aadfd73a6d18da082882f))
--- ### 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. --- - [ ] 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). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Weyert de Boer --- package-lock.json | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 82afc1d5d..e0a06a628 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6819,16 +6819,6 @@ "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", "dev": true }, - "node_modules/are-docs-informative": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.1.0.tgz", - "integrity": "sha512-CplVvB5za1z5Zn528h0EUogt/McTT7lvHZKFtb2NYldodL7G3u2O49Mgws3mP/TrKhpNuDjKPHYxmh8t2DGTtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -9636,14 +9626,14 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "50.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.7.0.tgz", - "integrity": "sha512-fMeHWVtdxXvLfMmKLXJWObJSt57zBz31RCLZYj3bLSHBqnEsyO50N1OLDi5XP5wh+Gte5van9WTtOnemKAZrSw==", + "version": "50.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.7.1.tgz", + "integrity": "sha512-XBnVA5g2kUVokTNUiE1McEPse5n9/mNUmuJcx52psT6zBs2eVcXSmQBvjfa7NZdfLVSy3u1pEDDUxoxpwy89WA==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@es-joy/jsdoccomment": "~0.50.2", - "are-docs-informative": "^0.1.0", + "are-docs-informative": "^0.0.2", "comment-parser": "1.4.1", "debug": "^4.4.1", "escape-string-regexp": "^4.0.0", @@ -9660,6 +9650,16 @@ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, + "node_modules/eslint-plugin-jsdoc/node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", From 5b9d59c77b225d7fec4b7428a3e7f193e9951a85 Mon Sep 17 00:00:00 2001 From: OpenFeature Bot <109696520+openfeaturebot@users.noreply.github.com> Date: Thu, 26 Jun 2025 16:15:03 -0400 Subject: [PATCH 49/55] chore(main): release core 1.8.1 (#1208) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit :robot: 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](https://github.com/open-feature/js-sdk/commit/3e6bcaef0bb5c05e914a0078f0cb884b7f74f068)) --- 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: Weyert de Boer --- .release-please-manifest.json | 2 +- packages/shared/CHANGELOG.md | 7 +++++++ packages/shared/package.json | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 543f0d240..11f88a86f 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -3,6 +3,6 @@ "packages/react": "1.0.0", "packages/web": "1.5.0", "packages/server": "1.18.0", - "packages/shared": "1.8.0", + "packages/shared": "1.8.1", "packages/angular/projects/angular-sdk": "0.0.15" } diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index 1c5f9f6bb..588b7b881 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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](https://github.com/open-feature/js-sdk/commit/3e6bcaef0bb5c05e914a0078f0cb884b7f74f068)) + ## [1.8.0](https://github.com/open-feature/js-sdk/compare/core-v1.7.2...core-v1.8.0) (2025-04-10) diff --git a/packages/shared/package.json b/packages/shared/package.json index 43416ee6c..08461fe07 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@openfeature/core", - "version": "1.8.0", + "version": "1.8.1", "description": "Shared OpenFeature JS components (server and web)", "main": "./dist/cjs/index.js", "files": [ From d00fc09f726c5172c4f070da849ac21f7a844868 Mon Sep 17 00:00:00 2001 From: Michael Beemer Date: Fri, 18 Jul 2025 15:08:01 -0400 Subject: [PATCH 50/55] feat: add evaluation-scoped hook data (#1216) Signed-off-by: Michael Beemer Signed-off-by: Weyert de Boer --- .../client/internal/open-feature-client.ts | 88 +-- packages/server/src/hooks/hook.ts | 3 +- packages/server/test/hooks-data.spec.ts | 508 ++++++++++++++++++ packages/shared/src/hooks/hook-data.ts | 72 +++ packages/shared/src/hooks/hook.ts | 16 +- packages/shared/src/hooks/hooks.ts | 6 +- packages/shared/src/hooks/index.ts | 1 + packages/shared/test/hook-data-types.spec.ts | 214 ++++++++ packages/shared/test/telemetry.spec.ts | 2 + .../client/internal/open-feature-client.ts | 63 ++- packages/web/src/hooks/hook.ts | 2 +- packages/web/test/hooks-data.spec.ts | 436 +++++++++++++++ 12 files changed, 1343 insertions(+), 68 deletions(-) create mode 100644 packages/server/test/hooks-data.spec.ts create mode 100644 packages/shared/src/hooks/hook-data.ts create mode 100644 packages/shared/test/hook-data-types.spec.ts create mode 100644 packages/web/test/hooks-data.spec.ts diff --git a/packages/server/src/client/internal/open-feature-client.ts b/packages/server/src/client/internal/open-feature-client.ts index 4f440e940..01120f693 100644 --- a/packages/server/src/client/internal/open-feature-client.ts +++ b/packages/server/src/client/internal/open-feature-client.ts @@ -22,6 +22,7 @@ import { StandardResolutionReasons, instantiateErrorByErrorCode, statusMatchesEvent, + MapHookData, } from '@openfeature/core'; import type { FlagEvaluationOptions } from '../../evaluation'; import type { ProviderEvents } from '../../events'; @@ -276,22 +277,26 @@ export class OpenFeatureClient implements Client { 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 = { - 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(() => + Object.freeze({ + flagKey, + defaultValue, + flagValueType: flagType, + clientMetadata: this.metadata, + providerMetadata: this._provider.metadata, + context: mergedContext, + logger: this._logger, + hookData: new MapHookData(), + }), + ); let evaluationDetails: EvaluationDetails; try { - const frozenContext = await this.beforeHooks(allHooks, hookContext, options); + const frozenContext = await this.beforeHooks(allHooks, hookContexts, mergedContext, options); this.shortCircuitIfNotReady(); @@ -306,53 +311,71 @@ export class OpenFeatureClient implements Client { if (resolutionDetails.errorCode) { const err = instantiateErrorByErrorCode(resolutionDetails.errorCode, resolutionDetails.errorMessage); - await this.errorHooks(allHooksReversed, hookContext, err, options); + await this.errorHooks(allHooksReversed, hookContexts, err, options); evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata); } else { - await this.afterHooks(allHooksReversed, hookContext, resolutionDetails, options); + await this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options); evaluationDetails = resolutionDetails; } } catch (err: unknown) { - await this.errorHooks(allHooksReversed, hookContext, err, options); + await this.errorHooks(allHooksReversed, hookContexts, err, options); evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err); } - await this.finallyHooks(allHooksReversed, hookContext, evaluationDetails, options); + 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; + + for (const [index, hook] of hooks.entries()) { + const hookContextIndex = hooks.length - 1 - index; // reverse index for before hooks + const hookContext = hookContexts[hookContextIndex]; - // use Object.assign to avoid modification of frozen hookContext - Object.assign(hookContext.context, { - ...hookContext.context, - ...(await hook?.before?.(hookContext, Object.freeze(options.hookHints))), - }); + // 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, 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}`); @@ -366,13 +389,14 @@ export class OpenFeatureClient implements Client { private async finallyHooks( hooks: Hook[], - hookContext: HookContext, + hookContexts: HookContext[], evaluationDetails: EvaluationDetails, options: FlagEvaluationOptions, ) { // run "finally" hooks sequentially - for (const hook of hooks) { + for (const [index, hook] of hooks.entries()) { try { + const hookContext = hookContexts[index]; await hook?.finally?.(hookContext, evaluationDetails, options.hookHints); } catch (err) { this._logger.error(`Unhandled error during 'finally' hook: ${err}`); diff --git a/packages/server/src/hooks/hook.ts b/packages/server/src/hooks/hook.ts index c7fb07731..b5f6ade90 100644 --- a/packages/server/src/hooks/hook.ts +++ b/packages/server/src/hooks/hook.ts @@ -1,7 +1,8 @@ import type { BaseHook, EvaluationContext, FlagValue } from '@openfeature/core'; -export type Hook = BaseHook< +export type Hook> = BaseHook< FlagValue, + TData, Promise | EvaluationContext | void, Promise | void >; diff --git a/packages/server/test/hooks-data.spec.ts b/packages/server/test/hooks-data.spec.ts new file mode 100644 index 000000000..92c163653 --- /dev/null +++ b/packages/server/test/hooks-data.spec.ts @@ -0,0 +1,508 @@ +import { OpenFeature } from '../src'; +import type { Client } from '../src/client'; +import type { + JsonValue, + ResolutionDetails, + HookContext, + BeforeHookContext, + HookData} from '@openfeature/core'; +import { + StandardResolutionReasons +} from '@openfeature/core'; +import type { Provider } from '../src/provider'; +import type { Hook } from '../src/hooks'; + +const BOOLEAN_VALUE = true; +const STRING_VALUE = 'val'; +const NUMBER_VALUE = 1; +const OBJECT_VALUE = { key: 'value' }; + +// A test hook that stores data in the before stage and retrieves it in after/error/finally +class TestHookWithData implements Hook { + beforeData: unknown; + afterData: unknown; + errorData: unknown; + finallyData: unknown; + + async before(hookContext: BeforeHookContext) { + // Store some data + hookContext.hookData.set('testKey', 'testValue'); + hookContext.hookData.set('timestamp', Date.now()); + hookContext.hookData.set('object', { nested: 'value' }); + this.beforeData = hookContext.hookData.get('testKey'); + } + + async after(hookContext: HookContext) { + // Retrieve data stored in before + this.afterData = hookContext.hookData.get('testKey'); + } + + async error(hookContext: HookContext) { + // Retrieve data stored in before + this.errorData = hookContext.hookData.get('testKey'); + } + + async finally(hookContext: HookContext) { + // Retrieve data stored in before + this.finallyData = hookContext.hookData.get('testKey'); + } +} + +// Typed hook example demonstrating improved type safety +interface OpenTelemetryData { + spanId: string; + traceId: string; + startTime: number; + attributes: Record; +} + +class TypedOpenTelemetryHook implements Hook { + spanId?: string; + duration?: number; + + async before(hookContext: BeforeHookContext) { + const spanId = `span-${Math.random().toString(36).substring(2, 11)}`; + const traceId = `trace-${Math.random().toString(36).substring(2, 11)}`; + + // Demonstrate that we can cast for type safety while maintaining compatibility + const typedHookData = hookContext.hookData as unknown as HookData; + + // Type-safe setting with proper intellisense + typedHookData.set('spanId', spanId); + typedHookData.set('traceId', traceId); + typedHookData.set('startTime', Date.now()); + typedHookData.set('attributes', { + flagKey: hookContext.flagKey, + clientName: hookContext.clientMetadata.name || 'unknown', + providerName: hookContext.providerMetadata.name, + }); + + this.spanId = spanId; + } + + async after(hookContext: HookContext) { + // Type-safe getting with proper return types + const typedHookData = hookContext.hookData as unknown as HookData; + const startTime: number | undefined = typedHookData.get('startTime'); + const spanId: string | undefined = typedHookData.get('spanId'); + + if (startTime && spanId) { + this.duration = Date.now() - startTime; + // Simulate span completion + } + } + + async error(hookContext: HookContext) { + const typedHookData = hookContext.hookData as unknown as HookData; + const spanId: string | undefined = typedHookData.get('spanId'); + if (spanId) { + // Mark span as error + } + } +} + +// A timing hook that measures evaluation duration +class TimingHook implements Hook { + duration?: number; + + async before(hookContext: BeforeHookContext) { + hookContext.hookData.set('startTime', Date.now()); + } + + async after(hookContext: HookContext) { + const startTime = hookContext.hookData.get('startTime') as number; + if (startTime) { + this.duration = Date.now() - startTime; + } + } + + async error(hookContext: HookContext) { + const startTime = hookContext.hookData.get('startTime') as number; + if (startTime) { + this.duration = Date.now() - startTime; + } + } +} + +// Hook that tests hook data isolation +class IsolationTestHook implements Hook { + hookId: string; + + constructor(id: string) { + this.hookId = id; + } + + before(hookContext: BeforeHookContext) { + const storedId = hookContext.hookData.get('hookId'); + if (storedId) { + throw new Error('Hook data isolation violated! Data is set in before hook.'); + } + + // Each hook instance should have its own data + hookContext.hookData.set('hookId', this.hookId); + hookContext.hookData.set(`data_${this.hookId}`, `value_${this.hookId}`); + } + + after(hookContext: HookContext) { + // Verify we can only see our own data + const storedId = hookContext.hookData.get('hookId'); + if (storedId !== this.hookId) { + throw new Error(`Hook data isolation violated! Expected ${this.hookId}, got ${storedId}`); + } + } +} + +// Mock provider for testing +const MOCK_PROVIDER: Provider = { + metadata: { name: 'mock-provider' }, + async resolveBooleanEvaluation(): Promise> { + return { + value: BOOLEAN_VALUE, + variant: 'default', + reason: StandardResolutionReasons.DEFAULT, + }; + }, + async resolveStringEvaluation(): Promise> { + return { + value: STRING_VALUE, + variant: 'default', + reason: StandardResolutionReasons.DEFAULT, + }; + }, + async resolveNumberEvaluation(): Promise> { + return { + value: NUMBER_VALUE, + variant: 'default', + reason: StandardResolutionReasons.DEFAULT, + }; + }, + async resolveObjectEvaluation(): Promise> { + return { + value: OBJECT_VALUE as unknown as T, + variant: 'default', + reason: StandardResolutionReasons.DEFAULT, + }; + }, +}; + +// Mock provider that throws an error +const ERROR_PROVIDER: Provider = { + metadata: { name: 'error-provider' }, + async resolveBooleanEvaluation(): Promise> { + throw new Error('Provider error'); + }, + async resolveStringEvaluation(): Promise> { + throw new Error('Provider error'); + }, + async resolveNumberEvaluation(): Promise> { + throw new Error('Provider error'); + }, + async resolveObjectEvaluation(): Promise> { + throw new Error('Provider error'); + }, +}; + +describe('Hook Data', () => { + let client: Client; + + beforeEach(async () => { + OpenFeature.clearHooks(); + await OpenFeature.setProviderAndWait(MOCK_PROVIDER); + client = OpenFeature.getClient(); + }); + + afterEach(async () => { + await OpenFeature.clearProviders(); + }); + + describe('Basic Hook Data Functionality', () => { + it('should allow hooks to store and retrieve data across stages', async () => { + const hook = new TestHookWithData(); + client.addHooks(hook); + + await client.getBooleanValue('test-flag', false); + + // Verify data was stored in before and retrieved in all other stages + expect(hook.beforeData).toBe('testValue'); + expect(hook.afterData).toBe('testValue'); + expect(hook.finallyData).toBe('testValue'); + }); + + it('should support storing different data types', async () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const storedValues: any = {}; + + const hook: Hook = { + async before(hookContext: BeforeHookContext) { + // Store various types + hookContext.hookData.set('string', 'test'); + hookContext.hookData.set('number', 42); + hookContext.hookData.set('boolean', true); + hookContext.hookData.set('object', { key: 'value' }); + hookContext.hookData.set('array', [1, 2, 3]); + hookContext.hookData.set('null', null); + hookContext.hookData.set('undefined', undefined); + }, + + async after(hookContext: HookContext) { + storedValues.string = hookContext.hookData.get('string'); + storedValues.number = hookContext.hookData.get('number'); + storedValues.boolean = hookContext.hookData.get('boolean'); + storedValues.object = hookContext.hookData.get('object'); + storedValues.array = hookContext.hookData.get('array'); + storedValues.null = hookContext.hookData.get('null'); + storedValues.undefined = hookContext.hookData.get('undefined'); + }, + }; + + client.addHooks(hook); + await client.getBooleanValue('test-flag', false); + + expect(storedValues.string).toBe('test'); + expect(storedValues.number).toBe(42); + expect(storedValues.boolean).toBe(true); + expect(storedValues.object).toEqual({ key: 'value' }); + expect(storedValues.array).toEqual([1, 2, 3]); + expect(storedValues.null).toBeNull(); + expect(storedValues.undefined).toBeUndefined(); + }); + + it('should handle hook data in error scenarios', async () => { + await OpenFeature.setProviderAndWait(ERROR_PROVIDER); + const hook = new TestHookWithData(); + client.addHooks(hook); + + await client.getBooleanValue('test-flag', false); + + // Verify data was accessible in error and finally stages + expect(hook.beforeData).toBe('testValue'); + expect(hook.errorData).toBe('testValue'); + expect(hook.finallyData).toBe('testValue'); + expect(hook.afterData).toBeUndefined(); // after should not run on error + }); + }); + + describe('Hook Data API', () => { + it('should support has() method', async () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hasResults: any = {}; + + const hook: Hook = { + async before(hookContext: BeforeHookContext) { + hookContext.hookData.set('exists', 'value'); + hasResults.beforeExists = hookContext.hookData.has('exists'); + hasResults.beforeNotExists = hookContext.hookData.has('notExists'); + }, + + async after(hookContext: HookContext) { + hasResults.afterExists = hookContext.hookData.has('exists'); + hasResults.afterNotExists = hookContext.hookData.has('notExists'); + }, + }; + + client.addHooks(hook); + await client.getBooleanValue('test-flag', false); + + expect(hasResults.beforeExists).toBe(true); + expect(hasResults.beforeNotExists).toBe(false); + expect(hasResults.afterExists).toBe(true); + expect(hasResults.afterNotExists).toBe(false); + }); + + it('should support delete() method', async () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const deleteResults: any = {}; + + const hook: Hook = { + async before(hookContext: BeforeHookContext) { + hookContext.hookData.set('toDelete', 'value'); + deleteResults.hasBeforeDelete = hookContext.hookData.has('toDelete'); + deleteResults.deleteResult = hookContext.hookData.delete('toDelete'); + deleteResults.hasAfterDelete = hookContext.hookData.has('toDelete'); + deleteResults.deleteAgainResult = hookContext.hookData.delete('toDelete'); + }, + }; + + client.addHooks(hook); + await client.getBooleanValue('test-flag', false); + + expect(deleteResults.hasBeforeDelete).toBe(true); + expect(deleteResults.deleteResult).toBe(true); + expect(deleteResults.hasAfterDelete).toBe(false); + expect(deleteResults.deleteAgainResult).toBe(false); + }); + + it('should support clear() method', async () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const clearResults: any = {}; + + const hook: Hook = { + async before(hookContext: BeforeHookContext) { + hookContext.hookData.set('key1', 'value1'); + hookContext.hookData.set('key2', 'value2'); + hookContext.hookData.set('key3', 'value3'); + clearResults.hasBeforeClear = hookContext.hookData.has('key1'); + hookContext.hookData.clear(); + clearResults.hasAfterClear = hookContext.hookData.has('key1'); + }, + + async after(hookContext: HookContext) { + // Verify all data was cleared + clearResults.afterHasKey1 = hookContext.hookData.has('key1'); + clearResults.afterHasKey2 = hookContext.hookData.has('key2'); + clearResults.afterHasKey3 = hookContext.hookData.has('key3'); + }, + }; + + client.addHooks(hook); + await client.getBooleanValue('test-flag', false); + + expect(clearResults.hasBeforeClear).toBe(true); + expect(clearResults.hasAfterClear).toBe(false); + expect(clearResults.afterHasKey1).toBe(false); + expect(clearResults.afterHasKey2).toBe(false); + expect(clearResults.afterHasKey3).toBe(false); + }); + }); + + describe('Hook Data Isolation', () => { + it('should isolate data between different hook instances', async () => { + const hook1 = new IsolationTestHook('hook1'); + const hook2 = new IsolationTestHook('hook2'); + const hook3 = new IsolationTestHook('hook3'); + + client.addHooks(hook1, hook2, hook3); + + expect(await client.getBooleanValue('test-flag', false)).toBe(true); + }); + + it('should isolate data between the same hook instance', async () => { + const hook = new IsolationTestHook('hook'); + + client.addHooks(hook, hook); + + expect(await client.getBooleanValue('test-flag', false)).toBe(true); + }); + + it('should not share data between different evaluations', async () => { + let firstEvalData: unknown; + let secondEvalData: unknown; + + const hook: Hook = { + async before(hookContext: BeforeHookContext) { + // Check if data exists from previous evaluation + const existingData = hookContext.hookData.get('evalData'); + if (existingData) { + throw new Error('Hook data leaked between evaluations!'); + } + hookContext.hookData.set('evalData', 'evaluation-specific'); + }, + + async after(hookContext: HookContext) { + if (!firstEvalData) { + firstEvalData = hookContext.hookData.get('evalData'); + } else { + secondEvalData = hookContext.hookData.get('evalData'); + } + }, + }; + + client.addHooks(hook); + + // First evaluation + await client.getBooleanValue('test-flag', false); + // Second evaluation + await client.getBooleanValue('test-flag', false); + + expect(firstEvalData).toBe('evaluation-specific'); + expect(secondEvalData).toBe('evaluation-specific'); + }); + + it('should isolate data between global, client, and invocation hooks', async () => { + const globalHook = new IsolationTestHook('global'); + const clientHook = new IsolationTestHook('client'); + const invocationHook = new IsolationTestHook('invocation'); + + OpenFeature.addHooks(globalHook); + client.addHooks(clientHook); + + expect(await client.getBooleanValue('test-flag', false, {}, { hooks: [invocationHook] })).toBe(true); + }); + }); + + describe('Use Cases', () => { + it('should support timing measurements', async () => { + const timingHook = new TimingHook(); + client.addHooks(timingHook); + + await client.getBooleanValue('test-flag', false); + + expect(timingHook.duration).toBeDefined(); + expect(timingHook.duration).toBeGreaterThanOrEqual(0); + }); + + it('should support multi-stage validation accumulation', async () => { + let finalErrors: string[] = []; + + const validationHook: Hook = { + async before(hookContext: BeforeHookContext) { + hookContext.hookData.set('errors', []); + + // Simulate validation + const errors = hookContext.hookData.get('errors') as string[]; + if (!hookContext.context.userId) { + errors.push('Missing userId'); + } + if (!hookContext.context.region) { + errors.push('Missing region'); + } + }, + + async finally(hookContext: HookContext) { + finalErrors = (hookContext.hookData.get('errors') as string[]) || []; + }, + }; + + client.addHooks(validationHook); + await client.getBooleanValue('test-flag', false, {}); + + expect(finalErrors).toContain('Missing userId'); + expect(finalErrors).toContain('Missing region'); + }); + + it('should support request correlation', async () => { + let correlationId: string | undefined; + + const correlationHook: Hook = { + async before(hookContext: BeforeHookContext) { + const id = `req-${Date.now()}-${Math.random()}`; + hookContext.hookData.set('correlationId', id); + }, + + async after(hookContext: HookContext) { + correlationId = hookContext.hookData.get('correlationId') as string; + }, + }; + + client.addHooks(correlationHook); + await client.getBooleanValue('test-flag', false); + + expect(correlationId).toBeDefined(); + expect(correlationId).toMatch(/^req-\d+-[\d.]+$/); + }); + + it('should support typed hook data for better type safety', async () => { + const typedHook = new TypedOpenTelemetryHook(); + client.addHooks(typedHook); + + await client.getBooleanValue('test-flag', false); + + // Verify the typed hook worked correctly + expect(typedHook.spanId).toBeDefined(); + expect(typedHook.spanId).toMatch(/^span-[a-z0-9]+$/); + expect(typedHook.duration).toBeDefined(); + expect(typeof typedHook.duration).toBe('number'); + expect(typedHook.duration).toBeGreaterThanOrEqual(0); + }); + }); +}); \ No newline at end of file diff --git a/packages/shared/src/hooks/hook-data.ts b/packages/shared/src/hooks/hook-data.ts new file mode 100644 index 000000000..dd323bc78 --- /dev/null +++ b/packages/shared/src/hooks/hook-data.ts @@ -0,0 +1,72 @@ +/** + * A mutable data structure for hooks to maintain state across their lifecycle. + * Each hook instance gets its own isolated data store that persists for the + * duration of a single flag evaluation. + * @template TData - A record type that defines the shape of the stored data + */ +export interface HookData> { + /** + * Sets a value in the hook data store. + * @param key The key to store the value under + * @param value The value to store + */ + set(key: K, value: TData[K]): void; + set(key: string, value: unknown): void; + + /** + * Gets a value from the hook data store. + * @param key The key to retrieve the value for + * @returns The stored value, or undefined if not found + */ + get(key: K): TData[K] | undefined; + get(key: string): unknown; + + /** + * Checks if a key exists in the hook data store. + * @param key The key to check + * @returns True if the key exists, false otherwise + */ + has(key: K): boolean; + has(key: string): boolean; + + /** + * Deletes a value from the hook data store. + * @param key The key to delete + * @returns True if the key was deleted, false if it didn't exist + */ + delete(key: K): boolean; + delete(key: string): boolean; + + /** + * Clears all values from the hook data store. + */ + clear(): void; +} + +/** + * Default implementation of HookData using a Map. + * @template TData - A record type that defines the shape of the stored data + */ +export class MapHookData> implements HookData { + private readonly data = new Map(); + + set(key: K, value: TData[K]): void { + this.data.set(key, value); + } + + get(key: K): TData[K] | undefined { + return this.data.get(key) as TData[K] | undefined; + } + + has(key: K): boolean { + return this.data.has(key); + } + + delete(key: K): boolean { + return this.data.delete(key); + } + + clear(): void { + this.data.clear(); + } +} \ No newline at end of file diff --git a/packages/shared/src/hooks/hook.ts b/packages/shared/src/hooks/hook.ts index 7c3c63376..e5985c55e 100644 --- a/packages/shared/src/hooks/hook.ts +++ b/packages/shared/src/hooks/hook.ts @@ -1,14 +1,19 @@ import type { BeforeHookContext, HookContext, HookHints } from './hooks'; import type { EvaluationDetails, FlagValue } from '../evaluation'; -export interface BaseHook { +export interface BaseHook< + T extends FlagValue = FlagValue, + TData = Record, + BeforeHookReturn = unknown, + HooksReturn = unknown +> { /** * Runs before flag values are resolved from the provider. * If an EvaluationContext is returned, it will be merged with the pre-existing EvaluationContext. * @param hookContext * @param hookHints */ - before?(hookContext: BeforeHookContext, hookHints?: HookHints): BeforeHookReturn; + before?(hookContext: BeforeHookContext, hookHints?: HookHints): BeforeHookReturn; /** * Runs after flag values are successfully resolved from the provider. @@ -17,7 +22,7 @@ export interface BaseHook>, + hookContext: Readonly>, evaluationDetails: EvaluationDetails, hookHints?: HookHints, ): HooksReturn; @@ -28,7 +33,7 @@ export interface BaseHook>, error: unknown, hookHints?: HookHints): HooksReturn; + error?(hookContext: Readonly>, error: unknown, hookHints?: HookHints): HooksReturn; /** * Runs after all other hook stages, regardless of success or error. @@ -37,8 +42,9 @@ export interface BaseHook>, + hookContext: Readonly>, evaluationDetails: EvaluationDetails, hookHints?: HookHints, ): HooksReturn; } + diff --git a/packages/shared/src/hooks/hooks.ts b/packages/shared/src/hooks/hooks.ts index 76233ece3..5e8b11590 100644 --- a/packages/shared/src/hooks/hooks.ts +++ b/packages/shared/src/hooks/hooks.ts @@ -2,10 +2,11 @@ import type { ProviderMetadata } from '../provider'; import type { ClientMetadata } from '../client'; import type { EvaluationContext, FlagValue, FlagValueType } from '../evaluation'; import type { Logger } from '../logger'; +import type { HookData } from './hook-data'; export type HookHints = Readonly>; -export interface HookContext { +export interface HookContext> { readonly flagKey: string; readonly defaultValue: T; readonly flagValueType: FlagValueType; @@ -13,8 +14,9 @@ export interface HookContext { readonly clientMetadata: ClientMetadata; readonly providerMetadata: ProviderMetadata; readonly logger: Logger; + readonly hookData: HookData; } -export interface BeforeHookContext extends HookContext { +export interface BeforeHookContext> extends HookContext { context: EvaluationContext; } diff --git a/packages/shared/src/hooks/index.ts b/packages/shared/src/hooks/index.ts index 5dee4fb45..47227681a 100644 --- a/packages/shared/src/hooks/index.ts +++ b/packages/shared/src/hooks/index.ts @@ -1,3 +1,4 @@ export * from './hook'; export * from './hooks'; export * from './evaluation-lifecycle'; +export * from './hook-data'; diff --git a/packages/shared/test/hook-data-types.spec.ts b/packages/shared/test/hook-data-types.spec.ts new file mode 100644 index 000000000..fa974a19a --- /dev/null +++ b/packages/shared/test/hook-data-types.spec.ts @@ -0,0 +1,214 @@ +import type { HookData, BaseHook, BeforeHookContext, HookContext } from '../src/hooks'; +import { MapHookData } from '../src/hooks'; +import type { FlagValue } from '../src/evaluation'; + +describe('Hook Data Type Safety', () => { + it('should provide type safety with typed hook data', () => { + // Define a strict type for hook data + interface MyHookData { + startTime: number; + userId: string; + metadata: { version: string; feature: boolean }; + tags: string[]; + } + + const hookData = new MapHookData(); + + // Type-safe setting and getting + hookData.set('startTime', 123456); + hookData.set('userId', 'user-123'); + hookData.set('metadata', { version: '1.0.0', feature: true }); + hookData.set('tags', ['tag1', 'tag2']); + + // TypeScript should infer the correct return types + const startTime: number | undefined = hookData.get('startTime'); + const userId: string | undefined = hookData.get('userId'); + const metadata: { version: string; feature: boolean } | undefined = hookData.get('metadata'); + const tags: string[] | undefined = hookData.get('tags'); + + // Verify the values + expect(startTime).toBe(123456); + expect(userId).toBe('user-123'); + expect(metadata).toEqual({ version: '1.0.0', feature: true }); + expect(tags).toEqual(['tag1', 'tag2']); + + // Type-safe existence checks + expect(hookData.has('startTime')).toBe(true); + expect(hookData.has('userId')).toBe(true); + expect(hookData.has('metadata')).toBe(true); + expect(hookData.has('tags')).toBe(true); + + // Type-safe deletion + expect(hookData.delete('tags')).toBe(true); + expect(hookData.has('tags')).toBe(false); + }); + + it('should support untyped usage for backward compatibility', () => { + const hookData: HookData = new MapHookData(); + + // Untyped usage still works + hookData.set('anyKey', 'anyValue'); + hookData.set('numberKey', 42); + hookData.set('objectKey', { nested: true }); + + const value: unknown = hookData.get('anyKey'); + const numberValue: unknown = hookData.get('numberKey'); + const objectValue: unknown = hookData.get('objectKey'); + + expect(value).toBe('anyValue'); + expect(numberValue).toBe(42); + expect(objectValue).toEqual({ nested: true }); + }); + + it('should support mixed usage with typed and untyped keys', () => { + interface PartiallyTypedData { + correlationId: string; + timestamp: number; + } + + const hookData: HookData = new MapHookData(); + + // Typed usage + hookData.set('correlationId', 'abc-123'); + hookData.set('timestamp', Date.now()); + + // Untyped usage for additional keys + hookData.set('dynamicKey', 'dynamicValue'); + + // Type-safe retrieval for typed keys + const correlationId: string | undefined = hookData.get('correlationId'); + const timestamp: number | undefined = hookData.get('timestamp'); + + // Untyped retrieval for dynamic keys + const dynamicValue: unknown = hookData.get('dynamicKey'); + + expect(correlationId).toBe('abc-123'); + expect(typeof timestamp).toBe('number'); + expect(dynamicValue).toBe('dynamicValue'); + }); + + it('should work with complex nested types', () => { + interface ComplexHookData { + request: { + id: string; + headers: Record; + body?: { [key: string]: unknown }; + }; + response: { + status: number; + data: unknown; + headers: Record; + }; + metrics: { + startTime: number; + endTime?: number; + duration?: number; + }; + } + + const hookData: HookData = new MapHookData(); + + const requestData = { + id: 'req-123', + headers: { 'Content-Type': 'application/json' }, + body: { flag: 'test-flag' }, + }; + + hookData.set('request', requestData); + hookData.set('metrics', { startTime: Date.now() }); + + const retrievedRequest = hookData.get('request'); + const retrievedMetrics = hookData.get('metrics'); + + expect(retrievedRequest).toEqual(requestData); + expect(retrievedMetrics?.startTime).toBeDefined(); + expect(typeof retrievedMetrics?.startTime).toBe('number'); + }); + + it('should support generic type inference', () => { + // This function demonstrates how the generic types work in practice + function createTypedHookData(): HookData { + return new MapHookData(); + } + + interface TimingData { + start: number; + checkpoint: number; + } + + const timingHookData = createTypedHookData(); + + timingHookData.set('start', performance.now()); + timingHookData.set('checkpoint', performance.now()); + + const start: number | undefined = timingHookData.get('start'); + const checkpoint: number | undefined = timingHookData.get('checkpoint'); + + expect(typeof start).toBe('number'); + expect(typeof checkpoint).toBe('number'); + }); + + it('should work with BaseHook interface without casting', () => { + interface TestHookData { + testId: string; + startTime: number; + metadata: { version: string }; + } + + class TestTypedHook implements BaseHook { + capturedData: { testId?: string; duration?: number } = {}; + + before(hookContext: BeforeHookContext) { + // No casting needed - TypeScript knows the types + hookContext.hookData.set('testId', 'test-123'); + hookContext.hookData.set('startTime', Date.now()); + hookContext.hookData.set('metadata', { version: '1.0.0' }); + } + + after(hookContext: HookContext) { + // Type-safe getting with proper return types + const testId: string | undefined = hookContext.hookData.get('testId'); + const startTime: number | undefined = hookContext.hookData.get('startTime'); + + if (testId && startTime) { + this.capturedData = { + testId, + duration: Date.now() - startTime, + }; + } + } + } + + const hook = new TestTypedHook(); + + // Create mock contexts that satisfy the BaseHook interface + const mockBeforeContext: BeforeHookContext = { + flagKey: 'test-flag', + defaultValue: true, + flagValueType: 'boolean', + context: {}, + clientMetadata: { + name: 'test-client', + domain: 'test-domain', + providerMetadata: { name: 'test-provider' }, + }, + providerMetadata: { name: 'test-provider' }, + logger: { debug: jest.fn(), info: jest.fn(), warn: jest.fn(), error: jest.fn() }, + hookData: new MapHookData(), + }; + + const mockAfterContext: HookContext = { + ...mockBeforeContext, + context: Object.freeze({}), + }; + + // Execute the hook methods + hook.before!(mockBeforeContext); + hook.after!(mockAfterContext); + + // Verify the typed hook worked correctly + expect(hook.capturedData.testId).toBe('test-123'); + expect(hook.capturedData.duration).toBeDefined(); + expect(typeof hook.capturedData.duration).toBe('number'); + }); +}); \ No newline at end of file diff --git a/packages/shared/test/telemetry.spec.ts b/packages/shared/test/telemetry.spec.ts index 35cbe7917..c8ca5f48d 100644 --- a/packages/shared/test/telemetry.spec.ts +++ b/packages/shared/test/telemetry.spec.ts @@ -2,6 +2,7 @@ import { createEvaluationEvent } from '../src/telemetry/evaluation-event'; import { ErrorCode, StandardResolutionReasons, type EvaluationDetails } from '../src/evaluation/evaluation'; import type { HookContext } from '../src/hooks/hooks'; import { TelemetryAttribute, TelemetryFlagMetadata } from '../src/telemetry'; +import { MapHookData } from '../src/hooks/hook-data'; describe('evaluationEvent', () => { const flagKey = 'test-flag'; @@ -25,6 +26,7 @@ describe('evaluationEvent', () => { error: jest.fn(), warn: jest.fn(), }, + hookData: new MapHookData(), }; it('should return basic event body with mandatory fields', () => { diff --git a/packages/web/src/client/internal/open-feature-client.ts b/packages/web/src/client/internal/open-feature-client.ts index 7eed9a9a6..3f3855ee9 100644 --- a/packages/web/src/client/internal/open-feature-client.ts +++ b/packages/web/src/client/internal/open-feature-client.ts @@ -22,6 +22,7 @@ import { StandardResolutionReasons, instantiateErrorByErrorCode, statusMatchesEvent, + MapHookData, } from '@openfeature/core'; import type { FlagEvaluationOptions } from '../../evaluation'; import type { ProviderEvents } from '../../events'; @@ -231,22 +232,26 @@ export class OpenFeatureClient implements Client { ...this.apiContextAccessor(this?.options?.domain), }; - // this reference cannot change during the course of evaluation - // it may be used as a key in WeakMaps - const hookContext: Readonly = { - flagKey, - defaultValue, - flagValueType: flagType, - clientMetadata: this.metadata, - providerMetadata: this._provider.metadata, - context, - 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(() => + Object.freeze({ + flagKey, + defaultValue, + flagValueType: flagType, + clientMetadata: this.metadata, + providerMetadata: this._provider.metadata, + context, + logger: this._logger, + hookData: new MapHookData(), + }), + ); let evaluationDetails: EvaluationDetails; try { - this.beforeHooks(allHooks, hookContext, options); + this.beforeHooks(allHooks, hookContexts, options); this.shortCircuitIfNotReady(); @@ -261,45 +266,48 @@ export class OpenFeatureClient implements Client { if (resolutionDetails.errorCode) { const err = instantiateErrorByErrorCode(resolutionDetails.errorCode, resolutionDetails.errorMessage); - this.errorHooks(allHooksReversed, hookContext, err, options); + this.errorHooks(allHooksReversed, hookContexts, err, options); evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err, resolutionDetails.flagMetadata); } else { - this.afterHooks(allHooksReversed, hookContext, resolutionDetails, options); + this.afterHooks(allHooksReversed, hookContexts, resolutionDetails, options); evaluationDetails = resolutionDetails; } } catch (err: unknown) { - this.errorHooks(allHooksReversed, hookContext, err, options); + this.errorHooks(allHooksReversed, hookContexts, err, options); evaluationDetails = this.getErrorEvaluationDetails(flagKey, defaultValue, err); } - this.finallyHooks(allHooksReversed, hookContext, evaluationDetails, options); + this.finallyHooks(allHooksReversed, hookContexts, evaluationDetails, options); return evaluationDetails; } - private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) { - Object.freeze(hookContext); - Object.freeze(hookContext.context); - - for (const hook of hooks) { + private beforeHooks(hooks: Hook[], hookContexts: HookContext[], options: FlagEvaluationOptions) { + for (const [index, hook] of hooks.entries()) { + const hookContextIndex = hooks.length - 1 - index; // reverse index for before hooks + const hookContext = hookContexts[hookContextIndex]; + Object.freeze(hookContext); + Object.freeze(hookContext.context); hook?.before?.(hookContext, Object.freeze(options.hookHints)); } } private afterHooks( hooks: Hook[], - hookContext: HookContext, + hookContexts: HookContext[], evaluationDetails: EvaluationDetails, options: FlagEvaluationOptions, ) { // run "after" hooks sequentially - for (const hook of hooks) { + for (const [index, hook] of hooks.entries()) { + const hookContext = hookContexts[index]; hook?.after?.(hookContext, evaluationDetails, options.hookHints); } } - private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) { + private 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]; hook?.error?.(hookContext, err, options.hookHints); } catch (err) { this._logger.error(`Unhandled error during 'error' hook: ${err}`); @@ -313,13 +321,14 @@ export class OpenFeatureClient implements Client { private finallyHooks( hooks: Hook[], - hookContext: HookContext, + hookContexts: HookContext[], evaluationDetails: EvaluationDetails, options: FlagEvaluationOptions, ) { // run "finally" hooks sequentially - for (const hook of hooks) { + for (const [index, hook] of hooks.entries()) { try { + const hookContext = hookContexts[index]; hook?.finally?.(hookContext, evaluationDetails, options.hookHints); } catch (err) { this._logger.error(`Unhandled error during 'finally' hook: ${err}`); diff --git a/packages/web/src/hooks/hook.ts b/packages/web/src/hooks/hook.ts index 20b2b8874..8dd71d848 100644 --- a/packages/web/src/hooks/hook.ts +++ b/packages/web/src/hooks/hook.ts @@ -1,3 +1,3 @@ import type { BaseHook, FlagValue } from '@openfeature/core'; -export type Hook = BaseHook; +export type Hook> = BaseHook; diff --git a/packages/web/test/hooks-data.spec.ts b/packages/web/test/hooks-data.spec.ts new file mode 100644 index 000000000..ca7992e19 --- /dev/null +++ b/packages/web/test/hooks-data.spec.ts @@ -0,0 +1,436 @@ +import { OpenFeatureAPI } from '../src/open-feature'; +import type { Client } from '../src/client'; +import type { JsonValue, ResolutionDetails, HookContext, BeforeHookContext } from '@openfeature/core'; +import { StandardResolutionReasons } from '@openfeature/core'; +import type { Provider } from '../src/provider'; +import type { Hook } from '../src/hooks'; + +const BOOLEAN_VALUE = true; +const STRING_VALUE = 'val'; +const NUMBER_VALUE = 1; +const OBJECT_VALUE = { key: 'value' }; + +// A test hook that stores data in the before stage and retrieves it in after/error/finally +class TestHookWithData implements Hook { + beforeData: unknown; + afterData: unknown; + errorData: unknown; + finallyData: unknown; + + before(hookContext: BeforeHookContext) { + // Store some data + hookContext.hookData.set('testKey', 'testValue'); + hookContext.hookData.set('timestamp', Date.now()); + hookContext.hookData.set('object', { nested: 'value' }); + this.beforeData = hookContext.hookData.get('testKey'); + } + + after(hookContext: HookContext) { + // Retrieve data stored in before + this.afterData = hookContext.hookData.get('testKey'); + } + + error(hookContext: HookContext) { + // Retrieve data stored in before + this.errorData = hookContext.hookData.get('testKey'); + } + + finally(hookContext: HookContext) { + // Retrieve data stored in before + this.finallyData = hookContext.hookData.get('testKey'); + } +} + +// A timing hook that measures evaluation duration +class TimingHook implements Hook { + duration?: number; + + before(hookContext: BeforeHookContext) { + hookContext.hookData.set('startTime', performance.now()); + } + + after(hookContext: HookContext) { + const startTime = hookContext.hookData.get('startTime') as number; + if (startTime) { + this.duration = performance.now() - startTime; + } + } + + error(hookContext: HookContext) { + const startTime = hookContext.hookData.get('startTime') as number; + if (startTime) { + this.duration = performance.now() - startTime; + } + } +} + +// Hook that tests hook data isolation +class IsolationTestHook implements Hook { + hookId: string; + + constructor(id: string) { + this.hookId = id; + } + + before(hookContext: BeforeHookContext) { + const storedId = hookContext.hookData.get('hookId'); + if (storedId) { + throw new Error('Hook data isolation violated! Data is set in before hook.'); + } + + // Each hook instance should have its own data + hookContext.hookData.set('hookId', this.hookId); + hookContext.hookData.set(`data_${this.hookId}`, `value_${this.hookId}`); + } + + after(hookContext: HookContext) { + // Verify we can only see our own data + const storedId = hookContext.hookData.get('hookId'); + if (storedId !== this.hookId) { + throw new Error(`Hook data isolation violated! Expected ${this.hookId}, got ${storedId}`); + } + } +} + +// Mock provider for testing +const MOCK_PROVIDER: Provider = { + metadata: { name: 'mock-provider' }, + resolveBooleanEvaluation(): ResolutionDetails { + return { + value: BOOLEAN_VALUE, + variant: 'default', + reason: StandardResolutionReasons.DEFAULT, + }; + }, + resolveStringEvaluation(): ResolutionDetails { + return { + value: STRING_VALUE, + variant: 'default', + reason: StandardResolutionReasons.DEFAULT, + }; + }, + resolveNumberEvaluation(): ResolutionDetails { + return { + value: NUMBER_VALUE, + variant: 'default', + reason: StandardResolutionReasons.DEFAULT, + }; + }, + resolveObjectEvaluation(): ResolutionDetails { + return { + value: OBJECT_VALUE as unknown as T, + variant: 'default', + reason: StandardResolutionReasons.DEFAULT, + }; + }, +} as Provider; + +// Mock provider that throws an error +const ERROR_PROVIDER: Provider = { + metadata: { name: 'error-provider' }, + resolveBooleanEvaluation(): ResolutionDetails { + throw new Error('Provider error'); + }, + resolveStringEvaluation(): ResolutionDetails { + throw new Error('Provider error'); + }, + resolveNumberEvaluation(): ResolutionDetails { + throw new Error('Provider error'); + }, + resolveObjectEvaluation(): ResolutionDetails { + throw new Error('Provider error'); + }, +}; + +describe('Hook Data (Web SDK)', () => { + let client: Client; + let api: OpenFeatureAPI; + + beforeEach(() => { + api = OpenFeatureAPI.getInstance(); + api.clearHooks(); + api.setProvider(MOCK_PROVIDER); + client = api.getClient(); + }); + + afterEach(() => { + api.clearProviders(); + }); + + describe('Basic Hook Data Functionality', () => { + it('should allow hooks to store and retrieve data across stages', () => { + const hook = new TestHookWithData(); + client.addHooks(hook); + + client.getBooleanValue('test-flag', false); + + // Verify data was stored in before and retrieved in all other stages + expect(hook.beforeData).toBe('testValue'); + expect(hook.afterData).toBe('testValue'); + expect(hook.finallyData).toBe('testValue'); + }); + + it('should support storing different data types', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const storedValues: any = {}; + + const hook: Hook = { + before(hookContext: BeforeHookContext) { + // Store various types + hookContext.hookData.set('string', 'test'); + hookContext.hookData.set('number', 42); + hookContext.hookData.set('boolean', true); + hookContext.hookData.set('object', { key: 'value' }); + hookContext.hookData.set('array', [1, 2, 3]); + hookContext.hookData.set('null', null); + hookContext.hookData.set('undefined', undefined); + }, + + after(hookContext: HookContext) { + storedValues.string = hookContext.hookData.get('string'); + storedValues.number = hookContext.hookData.get('number'); + storedValues.boolean = hookContext.hookData.get('boolean'); + storedValues.object = hookContext.hookData.get('object'); + storedValues.array = hookContext.hookData.get('array'); + storedValues.null = hookContext.hookData.get('null'); + storedValues.undefined = hookContext.hookData.get('undefined'); + }, + }; + + client.addHooks(hook); + client.getBooleanValue('test-flag', false); + + expect(storedValues.string).toBe('test'); + expect(storedValues.number).toBe(42); + expect(storedValues.boolean).toBe(true); + expect(storedValues.object).toEqual({ key: 'value' }); + expect(storedValues.array).toEqual([1, 2, 3]); + expect(storedValues.null).toBeNull(); + expect(storedValues.undefined).toBeUndefined(); + }); + + it('should handle hook data in error scenarios', () => { + api.setProvider(ERROR_PROVIDER); + const hook = new TestHookWithData(); + client.addHooks(hook); + + client.getBooleanValue('test-flag', false); + + // Verify data was accessible in error and finally stages + expect(hook.beforeData).toBe('testValue'); + expect(hook.errorData).toBe('testValue'); + expect(hook.finallyData).toBe('testValue'); + expect(hook.afterData).toBeUndefined(); // after should not run on error + }); + }); + + describe('Hook Data API', () => { + it('should support has() method', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const hasResults: any = {}; + + const hook: Hook = { + before(hookContext: BeforeHookContext) { + hookContext.hookData.set('exists', 'value'); + hasResults.beforeExists = hookContext.hookData.has('exists'); + hasResults.beforeNotExists = hookContext.hookData.has('notExists'); + }, + + after(hookContext: HookContext) { + hasResults.afterExists = hookContext.hookData.has('exists'); + hasResults.afterNotExists = hookContext.hookData.has('notExists'); + }, + }; + + client.addHooks(hook); + client.getBooleanValue('test-flag', false); + + expect(hasResults.beforeExists).toBe(true); + expect(hasResults.beforeNotExists).toBe(false); + expect(hasResults.afterExists).toBe(true); + expect(hasResults.afterNotExists).toBe(false); + }); + + it('should support delete() method', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const deleteResults: any = {}; + + const hook: Hook = { + before(hookContext: BeforeHookContext) { + hookContext.hookData.set('toDelete', 'value'); + deleteResults.hasBeforeDelete = hookContext.hookData.has('toDelete'); + deleteResults.deleteResult = hookContext.hookData.delete('toDelete'); + deleteResults.hasAfterDelete = hookContext.hookData.has('toDelete'); + deleteResults.deleteAgainResult = hookContext.hookData.delete('toDelete'); + }, + }; + + client.addHooks(hook); + client.getBooleanValue('test-flag', false); + + expect(deleteResults.hasBeforeDelete).toBe(true); + expect(deleteResults.deleteResult).toBe(true); + expect(deleteResults.hasAfterDelete).toBe(false); + expect(deleteResults.deleteAgainResult).toBe(false); + }); + + it('should support clear() method', () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const clearResults: any = {}; + + const hook: Hook = { + before(hookContext: BeforeHookContext) { + hookContext.hookData.set('key1', 'value1'); + hookContext.hookData.set('key2', 'value2'); + hookContext.hookData.set('key3', 'value3'); + clearResults.hasBeforeClear = hookContext.hookData.has('key1'); + hookContext.hookData.clear(); + clearResults.hasAfterClear = hookContext.hookData.has('key1'); + }, + + after(hookContext: HookContext) { + // Verify all data was cleared + clearResults.afterHasKey1 = hookContext.hookData.has('key1'); + clearResults.afterHasKey2 = hookContext.hookData.has('key2'); + clearResults.afterHasKey3 = hookContext.hookData.has('key3'); + }, + }; + + client.addHooks(hook); + client.getBooleanValue('test-flag', false); + + expect(clearResults.hasBeforeClear).toBe(true); + expect(clearResults.hasAfterClear).toBe(false); + expect(clearResults.afterHasKey1).toBe(false); + expect(clearResults.afterHasKey2).toBe(false); + expect(clearResults.afterHasKey3).toBe(false); + }); + }); + + describe('Hook Data Isolation', () => { + it('should isolate data between different hook instances', () => { + const hook1 = new IsolationTestHook('hook1'); + const hook2 = new IsolationTestHook('hook2'); + const hook3 = new IsolationTestHook('hook3'); + + client.addHooks(hook1, hook2, hook3); + + expect(client.getBooleanValue('test-flag', false)).toBe(true); + }); + + it('should isolate data between the same hook instance', () => { + const hook = new IsolationTestHook('hook'); + + client.addHooks(hook, hook); + + expect(client.getBooleanValue('test-flag', false)).toBe(true); + }); + + it('should not share data between different evaluations', () => { + let firstEvalData: unknown; + let secondEvalData: unknown; + + const hook: Hook = { + before(hookContext: BeforeHookContext) { + // Check if data exists from previous evaluation + const existingData = hookContext.hookData.get('evalData'); + if (existingData) { + throw new Error('Hook data leaked between evaluations!'); + } + hookContext.hookData.set('evalData', 'evaluation-specific'); + }, + + after(hookContext: HookContext) { + if (!firstEvalData) { + firstEvalData = hookContext.hookData.get('evalData'); + } else { + secondEvalData = hookContext.hookData.get('evalData'); + } + }, + }; + + client.addHooks(hook); + + // First evaluation + client.getBooleanValue('test-flag', false); + // Second evaluation + client.getBooleanValue('test-flag', false); + + expect(firstEvalData).toBe('evaluation-specific'); + expect(secondEvalData).toBe('evaluation-specific'); + }); + + it('should isolate data between global, client, and invocation hooks', () => { + const globalHook = new IsolationTestHook('global'); + const clientHook = new IsolationTestHook('client'); + const invocationHook = new IsolationTestHook('invocation'); + + api.addHooks(globalHook); + client.addHooks(clientHook); + + expect(client.getBooleanValue('test-flag', false, { hooks: [invocationHook] })).toBe(true); + }); + }); + + describe('Use Cases', () => { + it('should support timing measurements', () => { + const timingHook = new TimingHook(); + client.addHooks(timingHook); + + client.getBooleanValue('test-flag', false); + + expect(timingHook.duration).toBeDefined(); + expect(timingHook.duration).toBeGreaterThanOrEqual(0); + }); + + it('should support multi-stage validation accumulation', () => { + let finalErrors: string[] = []; + + const validationHook: Hook = { + before(hookContext: BeforeHookContext) { + hookContext.hookData.set('errors', []); + + // Simulate validation + const errors = hookContext.hookData.get('errors') as string[]; + if (!hookContext.context.userId) { + errors.push('Missing userId'); + } + if (!hookContext.context.region) { + errors.push('Missing region'); + } + }, + + finally(hookContext: HookContext) { + finalErrors = (hookContext.hookData.get('errors') as string[]) || []; + }, + }; + + client.addHooks(validationHook); + client.getBooleanValue('test-flag', false, {}); + + expect(finalErrors).toContain('Missing userId'); + expect(finalErrors).toContain('Missing region'); + }); + + it('should support request correlation', () => { + let correlationId: string | undefined; + + const correlationHook: Hook = { + before(hookContext: BeforeHookContext) { + const id = `req-${Date.now()}-${Math.random()}`; + hookContext.hookData.set('correlationId', id); + }, + + after(hookContext: HookContext) { + correlationId = hookContext.hookData.get('correlationId') as string; + }, + }; + + client.addHooks(correlationHook); + client.getBooleanValue('test-flag', false); + + expect(correlationId).toBeDefined(); + expect(correlationId).toMatch(/^req-\d+-[\d.]+$/); + }); + }); +}); \ No newline at end of file From b0fd0d7ff96a12e67d3213c185cbf1c5c3c6a830 Mon Sep 17 00:00:00 2001 From: Weyert de Boer Date: Sun, 20 Jul 2025 17:30:40 +0100 Subject: [PATCH 51/55] feat\!: improve FeatureFlag component API with predicate support BREAKING CHANGE: Renamed `featureKey` prop to `flagKey` to avoid React key conflicts. Removed `negate` prop in favor of custom predicate functions. - Rename `featureKey` prop to `flagKey` to prevent conflicts with React's reserved key prop - Add optional `predicate` function prop for flexible custom matching logic - Remove `negate` prop (negation can be handled via predicate functions) - Improve type safety with generic types and FlagValue constraints - Add default `equals` predicate function for standard equality matching - Remove debug console.log statement - Support truthy evaluation when no match value is provided Signed-off-by: Weyert de Boer --- .../react/src/declarative/FeatureFlag.tsx | 81 ++++++++++--------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/packages/react/src/declarative/FeatureFlag.tsx b/packages/react/src/declarative/FeatureFlag.tsx index 1777dbcca..d93d0ceab 100644 --- a/packages/react/src/declarative/FeatureFlag.tsx +++ b/packages/react/src/declarative/FeatureFlag.tsx @@ -1,16 +1,27 @@ import React from 'react'; import { useFlag } from '../evaluation'; import type { FlagQuery } from '../query'; +import type { FlagValue, EvaluationDetails } from '@openfeature/core'; /** - * Props for the Feature component that conditionally renders content based on feature flag state. - * @interface FeatureProps + * Default predicate function that checks if the expected value equals the actual flag value. + * @param {T} expected The expected value to match against + * @param {EvaluationDetails} actual The evaluation details containing the actual flag value + * @returns {boolean} true if the values match, false otherwise */ -interface FeatureProps { +function equals(expected: T, actual: EvaluationDetails): boolean { + return expected === actual.value; +} + +/** + * Props for the FeatureFlag component that conditionally renders content based on feature flag state. + * @interface FeatureFlagProps + */ +interface FeatureFlagProps { /** * The key of the feature flag to evaluate. */ - featureKey: string; + flagKey: string; /** * Optional value to match against the feature flag value. @@ -18,47 +29,48 @@ interface FeatureProps { * If a boolean, it will check if the flag is enabled (true) or disabled (false). * If a string, it will check if the flag variant equals this string. */ - match?: string | boolean; + match?: T; + + /** + * Optional predicate function for custom matching logic. + * If provided, this function will be used instead of the default equality check. + * @param expected The expected value (from match prop) + * @param actual The evaluation details + * @returns true if the condition is met, false otherwise + */ + predicate?: (expected: T | undefined, actual: EvaluationDetails) => boolean; /** * Default value to use when the feature flag is not found. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - defaultValue: any; + defaultValue: T; /** * Content to render when the feature flag condition is met. * Can be a React node or a function that receives flag query details and returns a React node. */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - children: React.ReactNode | ((details: FlagQuery) => React.ReactNode); + children: React.ReactNode | ((details: FlagQuery) => React.ReactNode); /** * Optional content to render when the feature flag condition is not met. */ fallback?: React.ReactNode; - - /** - * If true, inverts the condition logic (renders children when condition is NOT met). - */ - negate?: boolean; } /** * FeatureFlag component that conditionally renders its children based on the evaluation of a feature flag. - * - * @param {FeatureProps} props The properties for the FeatureFlag component. + * @param {FeatureFlagProps} props The properties for the FeatureFlag component. * @returns {React.ReactElement | null} The rendered component or null if the feature is not enabled. */ -export function FeatureFlag({ - featureKey, +export function FeatureFlag({ + flagKey, match, - negate = false, - defaultValue = true, + predicate, + defaultValue, children, fallback = null, -}: FeatureProps): React.ReactElement | null { - const details = useFlag(featureKey, defaultValue, { +}: FeatureFlagProps): React.ReactElement | null { + const details = useFlag(flagKey, defaultValue, { updateOnContextChanged: true, }); @@ -67,23 +79,20 @@ export function FeatureFlag({ return <>{fallback}; } - let isMatch = false; - if (typeof match === 'string') { - isMatch = details.variant === match; - } else if (typeof match !== 'undefined') { - isMatch = details.value === match; + // Use custom predicate if provided, otherwise use default matching logic + let shouldRender = false; + if (predicate) { + shouldRender = predicate(match, details.details as EvaluationDetails); + } else if (match !== undefined) { + // Default behavior: check if match value equals flag value + shouldRender = equals(match, details.details as EvaluationDetails); + } else { + // If no match value is provided, render if flag is truthy + shouldRender = Boolean(details.value); } - // If match is undefined, we assume the flag is enabled - if (match === void 0) { - isMatch = true; - } - - const shouldRender = negate ? !isMatch : isMatch; - if (shouldRender) { - console.log('chop chop'); - const childNode: React.ReactNode = typeof children === 'function' ? children(details) : children; + const childNode: React.ReactNode = typeof children === 'function' ? children(details as FlagQuery) : children; return <>{childNode}; } From c24b83f6ba4d464be9319e2dcca723cc8924ef08 Mon Sep 17 00:00:00 2001 From: Weyert de Boer Date: Sun, 20 Jul 2025 17:30:47 +0100 Subject: [PATCH 52/55] test: update FeatureFlag tests for new API - Update tests to use new `flagKey` prop instead of `featureKey` - Add comprehensive test coverage for custom predicate function - Add tests for truthy/falsy flag evaluation without match values - Fix string match test to use actual flag value instead of variant - Improve type safety in test predicate functions Signed-off-by: Weyert de Boer --- packages/react/test/declarative.spec.tsx | 41 ++++++++++++++++++++---- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/packages/react/test/declarative.spec.tsx b/packages/react/test/declarative.spec.tsx index 02d36b649..e6006ff69 100644 --- a/packages/react/test/declarative.spec.tsx +++ b/packages/react/test/declarative.spec.tsx @@ -59,7 +59,7 @@ describe('Feature Component', () => { it('should not show the feature component if the flag is not enabled', () => { render( - + , @@ -71,7 +71,7 @@ describe('Feature Component', () => { it('should fallback when provided', () => { render( - Fallback}> + Fallback}> , @@ -82,10 +82,10 @@ describe('Feature Component', () => { screen.debug(); }); - it('should handle showing multivariate flags with bool match', () => { + it('should handle showing multivariate flags with string match', () => { render( - + , @@ -94,10 +94,27 @@ describe('Feature Component', () => { expect(screen.queryByText(childText)).toBeInTheDocument(); }); - it('should show the feature component if the flag is not enabled but negate is true', () => { + it('should support custom predicate function', () => { + const customPredicate = (expected: boolean | undefined, actual: { value: boolean }) => { + // Custom logic: render if flag is NOT the expected value (negation) + return expected !== undefined ? actual.value !== expected : !actual.value; + }; + + render( + + + + + , + ); + + expect(screen.queryByText(childText)).toBeInTheDocument(); + }); + + it('should render children when no match is provided and flag is truthy', () => { render( - + , @@ -105,5 +122,17 @@ describe('Feature Component', () => { expect(screen.queryByText(childText)).toBeInTheDocument(); }); + + it('should not render children when no match is provided and flag is falsy', () => { + render( + + + + + , + ); + + expect(screen.queryByText(childText)).not.toBeInTheDocument(); + }); }); }); From 17d0c95feed4d6416136f0a2faace5a2f8207273 Mon Sep 17 00:00:00 2001 From: Weyert de Boer Date: Sun, 20 Jul 2025 17:30:54 +0100 Subject: [PATCH 53/55] chore: update package-lock.json Update package-lock.json after dependency installation Signed-off-by: Weyert de Boer --- package-lock.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index e0a06a628..c66d2fd15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23779,7 +23779,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -24703,7 +24702,7 @@ }, "packages/shared": { "name": "@openfeature/core", - "version": "1.8.0", + "version": "1.8.1", "license": "Apache-2.0", "devDependencies": {} }, From 7398a9b284db7cfaba3db9e04f1f3cce751533f7 Mon Sep 17 00:00:00 2001 From: Weyert de Boer Date: Tue, 22 Jul 2025 13:15:29 +0000 Subject: [PATCH 54/55] fix: improve the README file of the React package Signed-off-by: Weyert de Boer --- packages/react/README.md | 81 ++++++++++++++++++- .../react/src/declarative/FeatureFlag.tsx | 1 + 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/packages/react/README.md b/packages/react/README.md index c5f326407..1eed7b547 100644 --- a/packages/react/README.md +++ b/packages/react/README.md @@ -50,6 +50,7 @@ In addition to the feature provided by the [web sdk](https://openfeature.dev/doc - [Usage](#usage) - [OpenFeatureProvider context provider](#openfeatureprovider-context-provider) - [Evaluation hooks](#evaluation-hooks) + - [Declarative components](#declarative-components) - [Multiple Providers and Domains](#multiple-providers-and-domains) - [Re-rendering with Context Changes](#re-rendering-with-context-changes) - [Re-rendering with Flag Configuration Changes](#re-rendering-with-flag-configuration-changes) @@ -170,6 +171,72 @@ const { } = useBooleanFlagDetails('new-message', false); ``` +#### Declarative components + +The React SDK includes declarative components for feature flagging that provide a more JSX-native approach to conditional rendering. + +##### FeatureFlag Component + +The `FeatureFlag` component conditionally renders its children based on feature flag evaluation: + +```tsx +import { FeatureFlag } from '@openfeature/react-sdk'; + +function App() { + return ( + + {/* Basic usage - renders children when flag is truthy */} + + + + + {/* Match specific values */} + + + + + {/* Boolean flag with fallback */} + } + > + + + + {/* Custom predicate function for complex matching */} + actual.value.includes('beta')} + > + + + + {/* Function as children for accessing flag details */} + + {(flagDetails) => ( + + )} + + + ); +} +``` + +The `FeatureFlag` component supports the following props: + +- **`flagKey`** (required): The feature flag key to evaluate +- **`defaultValue`** (required): Default value when the flag is not available +- **`match`** (optional): Value to match against the flag value. By default, strict equality (===) is used for comparison +- **`predicate`** (optional): Custom function for matching logic that receives the expected value and evaluation details +- **`children`**: Content to render when condition is met (can be JSX or a function receiving flag details) +- **`fallback`** (optional): Content to render when condition is not met + #### Multiple Providers and Domains Multiple providers can be used by passing a `domain` to the `OpenFeatureProvider`: @@ -306,8 +373,8 @@ function MyComponent() { ### 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: +This allows you to easily test components that use evaluation hooks (such as `useFlag`) or declarative components (such as `FeatureFlag`). +If you try to test a component (in this case, `MyComponent`) which uses feature flags, you might see an error message like: > No OpenFeature client available - components using OpenFeature must be wrapped with an ``. @@ -328,6 +395,16 @@ If you'd like to control the values returned by the evaluation hooks, you can pa + +// testing declarative FeatureFlag components + + + + + + + + ``` Additionally, you can pass an artificial delay for the provider startup to test your suspense boundaries or loaders/spinners impacted by feature flags: diff --git a/packages/react/src/declarative/FeatureFlag.tsx b/packages/react/src/declarative/FeatureFlag.tsx index d93d0ceab..2dc5ea10d 100644 --- a/packages/react/src/declarative/FeatureFlag.tsx +++ b/packages/react/src/declarative/FeatureFlag.tsx @@ -26,6 +26,7 @@ interface FeatureFlagProps { /** * Optional value to match against the feature flag value. * If provided, the component will only render children when the flag value matches this value. + * By default, strict equality (===) is used for comparison. * If a boolean, it will check if the flag is enabled (true) or disabled (false). * If a string, it will check if the flag variant equals this string. */ From 70e640738cba762f289c84ecd434aab51fbf69b6 Mon Sep 17 00:00:00 2001 From: Weyert de Boer Date: Tue, 22 Jul 2025 15:07:02 +0100 Subject: [PATCH 55/55] feat(react): add function-based fallback support to FeatureFlag component The fallback prop now accepts a function that receives EvaluationDetails as an argument, providing more control over fallback rendering based on evaluation context. BREAKING CHANGE: None - maintains backward compatibility with static React nodes Signed-off-by: Weyert de Boer --- .../react/src/declarative/FeatureFlag.tsx | 9 ++- packages/react/test/declarative.spec.tsx | 71 +++++++++++++++++++ 2 files changed, 77 insertions(+), 3 deletions(-) diff --git a/packages/react/src/declarative/FeatureFlag.tsx b/packages/react/src/declarative/FeatureFlag.tsx index 2dc5ea10d..f1cd967b9 100644 --- a/packages/react/src/declarative/FeatureFlag.tsx +++ b/packages/react/src/declarative/FeatureFlag.tsx @@ -54,8 +54,9 @@ interface FeatureFlagProps { /** * Optional content to render when the feature flag condition is not met. + * Can be a React node or a function that receives evaluation details and returns a React node. */ - fallback?: React.ReactNode; + fallback?: React.ReactNode | ((details: EvaluationDetails) => React.ReactNode); } /** @@ -77,7 +78,8 @@ export function FeatureFlag({ // If the flag evaluation failed, we render the fallback if (details.reason === 'ERROR') { - return <>{fallback}; + const fallbackNode: React.ReactNode = typeof fallback === 'function' ? fallback(details.details as EvaluationDetails) : fallback; + return <>{fallbackNode}; } // Use custom predicate if provided, otherwise use default matching logic @@ -97,5 +99,6 @@ export function FeatureFlag({ return <>{childNode}; } - return <>{fallback}; + const fallbackNode: React.ReactNode = typeof fallback === 'function' ? fallback(details.details as EvaluationDetails) : fallback; + return <>{fallbackNode}; } diff --git a/packages/react/test/declarative.spec.tsx b/packages/react/test/declarative.spec.tsx index e6006ff69..fcc803631 100644 --- a/packages/react/test/declarative.spec.tsx +++ b/packages/react/test/declarative.spec.tsx @@ -3,6 +3,7 @@ import '@testing-library/jest-dom'; // see: https://testing-library.com/docs/rea import { render, screen } from '@testing-library/react'; import { FeatureFlag } from '../src/declarative/FeatureFlag'; // Assuming Feature.tsx is in the same directory or adjust path import { InMemoryProvider, OpenFeature, OpenFeatureProvider } from '../src'; +import type { EvaluationDetails } from '@openfeature/core'; describe('Feature Component', () => { const EVALUATION = 'evaluation'; @@ -134,5 +135,75 @@ describe('Feature Component', () => { expect(screen.queryByText(childText)).not.toBeInTheDocument(); }); + + it('should support function-based fallback with EvaluationDetails', () => { + const fallbackFunction = jest.fn((details: EvaluationDetails) =>
Fallback: {details.flagKey}
); + + render( + + + + + , + ); + + expect(fallbackFunction).toHaveBeenCalled(); + expect(fallbackFunction).toHaveBeenCalledWith(expect.objectContaining({ + flagKey: MISSING_FLAG_KEY + })); + expect(screen.queryByText(`Fallback: ${MISSING_FLAG_KEY}`)).toBeInTheDocument(); + }); + + it('should pass correct EvaluationDetails to function-based fallback', () => { + const fallbackFunction = jest.fn((details: EvaluationDetails) => { + return
Flag: {details.flagKey}, Value: {String(details.value)}, Reason: {details.reason}
; + }); + + render( + + + + + , + ); + + expect(fallbackFunction).toHaveBeenCalledWith(expect.objectContaining({ + flagKey: MISSING_FLAG_KEY, + value: false, + reason: expect.any(String) + })); + }); + + it('should support function-based fallback for error conditions', () => { + // Create a provider that will cause an error + const errorProvider = new InMemoryProvider({}); + OpenFeature.setProvider('error-test', errorProvider); + + const fallbackFunction = jest.fn((details: EvaluationDetails) =>
Error fallback: {details.reason}
); + + render( + + + + + , + ); + + expect(fallbackFunction).toHaveBeenCalled(); + expect(screen.queryByText(childText)).not.toBeInTheDocument(); + }); + + it('should render static fallback when fallback is not a function', () => { + render( + + Static fallback}> + + + , + ); + + expect(screen.queryByText('Static fallback')).toBeInTheDocument(); + expect(screen.queryByText(childText)).not.toBeInTheDocument(); + }); }); });