@openfeature/web-sdk 0.0.2-experimental

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/index.ts", "../../../shared/src/types.ts", "../../../shared/src/errors/open-feature-error-abstract.ts", "../../../shared/src/errors/general-error.ts", "../../../shared/src/errors/flag-not-found-error.ts", "../../../shared/src/errors/parse-error.ts", "../../../shared/src/errors/type-mismatch-error.ts", "../../../shared/src/errors/targeting-key-missing-error.ts", "../../../shared/src/errors/invalid-context-error.ts", "../../../shared/src/logger.ts", "../../../shared/src/no-op-transaction-context-propagator.ts", "../../../shared/src/open-feature.ts", "../../src/no-op-provider.ts", "../../src/open-feature.ts", "../../src/client.ts"],
4
+ "sourcesContent": ["\nexport * from './client';\nexport * from './no-op-provider';\nexport * from './open-feature';\nexport * from './types';\nexport * from '@openfeature/shared';", "export type PrimitiveValue = null | boolean | string | number;\n\nexport enum ProviderEvents {\n /**\n * The provider is ready to evaluate flags.\n */\n Ready = 'PROVIDER_READY',\n\n /**\n * The provider is in an error state.\n */\n Error = 'PROVIDER_ERROR',\n \n /**\n * The flag configuration in the source-of-truth has changed.\n */\n ConfigurationChanged = 'PROVIDER_CONFIGURATION_CHANGED',\n \n /**\n * The provider is transitioning to a state of unavailability.\n */\n Shutdown = 'PROVIDER_SHUTDOWN',\n};\n\nexport interface EventData {\n flagKeysChanged?: string[],\n changeMetadata?: { [key: string]: boolean | string } // similar to flag metadata\n}\n\nexport enum ApiEvents {\n ProviderChanged = 'providerChanged',\n}\n\nexport interface Eventing {\n addHandler(notificationType: string, handler: Handler): void\n}\n\nexport type EventContext = {\n notificationType: string;\n [key: string]: unknown;\n}\n\nexport type Handler = (eventContext?: EventContext) => void\n\nexport type EventCallbackMessage = (eventContext: EventContext) => void\n\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type JsonArray = JsonValue[];\n\n/**\n * Represents a JSON node value.\n */\nexport type JsonValue = PrimitiveValue | JsonObject | JsonArray;\n\n/**\n * Represents a JSON node value, or Date.\n */\nexport type EvaluationContextValue =\n | PrimitiveValue\n | Date\n | { [key: string]: EvaluationContextValue }\n | EvaluationContextValue[];\n\n/**\n * A container for arbitrary contextual data that can be used as a basis for dynamic evaluation\n */\nexport type EvaluationContext = {\n /**\n * A string uniquely identifying the subject (end-user, or client service) of a flag evaluation.\n * Providers may require this field for fractional flag evaluation, rules, or overrides targeting specific users.\n * Such providers may behave unpredictably if a targeting key is not specified at flag resolution.\n */\n targetingKey?: string;\n} & Record<string, EvaluationContextValue>;\n\nexport type FlagValue = boolean | string | number | JsonValue;\n\nexport type FlagValueType = 'boolean' | 'string' | 'number' | 'object';\n\n\nexport interface Logger {\n error(...args: unknown[]): void;\n warn(...args: unknown[]): void;\n info(...args: unknown[]): void;\n debug(...args: unknown[]): void;\n}\n\nexport const StandardResolutionReasons = {\n /**\n * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.\n */\n TARGETING_MATCH: 'TARGETING_MATCH',\n\n /**\n * The resolved value was the result of pseudorandom assignment.\n */\n SPLIT: 'SPLIT',\n\n /**\n * The resolved value was the result of the flag being disabled in the management system.\n */\n DISABLED: 'DISABLED',\n\n /**\n * \tThe resolved value was configured statically, or otherwise fell back to a pre-configured value.\n */\n DEFAULT: 'DEFAULT',\n\n /**\n * The reason for the resolved value could not be determined.\n */\n UNKNOWN: 'UNKNOWN',\n \n /**\n * The resolved value is static (no dynamic evaluation).\n */\n STATIC: 'STATIC',\n \n /**\n * The resolved value was retrieved from cache.\n */\n CACHED: 'CACHED',\n\n /**\n * The resolved value was the result of an error.\n *\n * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.\n */\n ERROR: 'ERROR',\n} as const;\n\nexport enum ErrorCode {\n /**\n * The value was resolved before the provider was ready.\n */\n PROVIDER_NOT_READY = 'PROVIDER_NOT_READY',\n\n /**\n * The flag could not be found.\n */\n FLAG_NOT_FOUND = 'FLAG_NOT_FOUND',\n\n /**\n * An error was encountered parsing data, such as a flag configuration.\n */\n PARSE_ERROR = 'PARSE_ERROR',\n\n /**\n * The type of the flag value does not match the expected type.\n */\n TYPE_MISMATCH = 'TYPE_MISMATCH',\n\n /**\n * The provider requires a targeting key and one was not provided in the evaluation context.\n */\n TARGETING_KEY_MISSING = 'TARGETING_KEY_MISSING',\n\n /**\n * The evaluation context does not meet provider requirements.\n */\n INVALID_CONTEXT = 'INVALID_CONTEXT',\n\n /**\n * An error with an unspecified code.\n */\n GENERAL = 'GENERAL',\n}\n\nexport type ResolutionReason = keyof typeof StandardResolutionReasons | (string & Record<never, never>);\n\nexport type ResolutionDetails<U> = {\n value: U;\n variant?: string;\n reason?: ResolutionReason;\n errorCode?: ErrorCode;\n errorMessage?: string;\n};\n\nexport type EvaluationDetails<T extends FlagValue> = {\n flagKey: string;\n} & ResolutionDetails<T>;\n\nexport interface ManageContext<T> {\n /**\n * Access the evaluation context set on the receiver.\n *\n * @returns {EvaluationContext} Evaluation context\n */\n getContext(): EvaluationContext;\n\n /**\n * Sets evaluation context that will be used during flag evaluations\n * on this receiver.\n *\n * @template T The type of the receiver\n * @param {EvaluationContext} context Evaluation context\n * @returns {T} The receiver (this object)\n */\n setContext(context: EvaluationContext): T;\n}\n\nexport interface ManageLogger<T> {\n /**\n * Sets a logger on this receiver. This logger supersedes to the global logger\n * and is passed to various components in the SDK.\n * The logger configured on the global API object will be used for all evaluations,\n * unless overridden in a particular client.\n *\n * @template T The type of the receiver\n * @param {Logger} logger The logger to be used\n * @returns {T} The receiver (this object)\n */\n setLogger(logger: Logger): T;\n}\n\nexport type HookHints = Readonly<Record<string, unknown>>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface Metadata {}\n\nexport interface ClientMetadata extends Metadata {\n readonly version?: string;\n readonly name?: string;\n}\n\nexport interface ProviderMetadata extends Metadata {\n readonly name: string;\n}\n\nexport interface HookContext<T extends FlagValue = FlagValue> {\n readonly flagKey: string;\n readonly defaultValue: T;\n readonly flagValueType: FlagValueType;\n readonly context: Readonly<EvaluationContext>;\n readonly clientMetadata: ClientMetadata;\n readonly providerMetadata: ProviderMetadata;\n readonly logger: Logger;\n}\n\nexport interface BeforeHookContext extends HookContext {\n context: EvaluationContext;\n}\n\n/**\n * Transaction context is a mechanism for adding transaction specific context that\n * is merged with evaluation context prior to flag evaluation. Examples of potential\n * transaction specific context include: a user id, user agent, or request path.\n */\nexport type TransactionContext = EvaluationContext;\n\nexport interface ManageTransactionContextPropagator<T> extends TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets a transaction context propagator on this receiver. The transaction context\n * propagator is responsible for persisting context for the duration of a single\n * transaction.\n *\n * @experimental\n * @template T The type of the receiver\n * @param {TransactionContextPropagator} transactionContextPropagator The context propagator to be used\n * @returns {T} The receiver (this object)\n */\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): T;\n}\n\nexport interface TransactionContextPropagator {\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Returns the currently defined transaction context using the registered transaction\n * context propagator.\n *\n * @experimental\n * @returns {TransactionContext} The current transaction context\n */\n getTransactionContext(): TransactionContext;\n\n /**\n * EXPERIMENTAL: Transaction context propagation is experimental and subject to change.\n * The OpenFeature Enhancement Proposal regarding transaction context can be found [here](https://github.com/open-feature/ofep/pull/32).\n *\n * Sets the transaction context using the registered transaction context propagator.\n *\n * @experimental\n * @template R The return value of the callback\n * @param {TransactionContext} transactionContext The transaction specific context\n * @param {(...args: unknown[]) => R} callback Callback function used to set the transaction context on the stack\n * @param {...unknown[]} args Optional arguments that are passed to the callback function\n */\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void;\n}\n\nexport interface CommonProvider {\n readonly metadata: ProviderMetadata;\n // TODO: move close from client Provider here once we want it in server\n}", "import { ErrorCode } from '../types';\n\nexport abstract class OpenFeatureError extends Error {\n abstract code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, OpenFeatureError.prototype);\n this.name = 'OpenFeatureError';\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class GeneralError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, GeneralError.prototype);\n this.name = 'GeneralError';\n this.code = ErrorCode.GENERAL;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class FlagNotFoundError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, FlagNotFoundError.prototype);\n this.name = 'FlagNotFoundError';\n this.code = ErrorCode.FLAG_NOT_FOUND;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class ParseError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, ParseError.prototype);\n this.name = 'ParseError';\n this.code = ErrorCode.PARSE_ERROR;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TypeMismatchError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TypeMismatchError.prototype);\n this.name = 'TypeMismatchError';\n this.code = ErrorCode.TYPE_MISMATCH;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class TargetingKeyMissingError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);\n this.name = 'TargetingKeyMissingError';\n this.code = ErrorCode.TARGETING_KEY_MISSING;\n }\n}\n", "import { ErrorCode } from '../types';\nimport { OpenFeatureError } from './open-feature-error-abstract';\n\nexport class InvalidContextError extends OpenFeatureError {\n code: ErrorCode;\n constructor(message?: string) {\n super(message);\n Object.setPrototypeOf(this, InvalidContextError.prototype);\n this.name = 'InvalidContextError';\n this.code = ErrorCode.INVALID_CONTEXT;\n }\n}\n", "/* eslint-disable @typescript-eslint/no-empty-function */\nimport { Logger } from './types';\n\nconst LOG_LEVELS: Array<keyof Logger> = ['error', 'warn', 'info', 'debug'];\nexport class DefaultLogger implements Logger {\n error(...args: unknown[]): void {\n console.error(...args);\n }\n warn(...args: unknown[]): void {\n console.warn(...args);\n }\n info(): void {}\n debug(): void {}\n}\n\nexport class SafeLogger implements Logger {\n private readonly logger: Logger;\n private readonly fallbackLogger = new DefaultLogger();\n\n constructor(logger: Logger) {\n try {\n for (const level of LOG_LEVELS) {\n if (!logger[level] || typeof logger[level] !== 'function') {\n throw new Error(`The provided logger is missing the ${level} method.`);\n }\n }\n this.logger = logger;\n } catch (err) {\n console.error(err);\n console.error('Falling back to the default logger.');\n this.logger = this.fallbackLogger;\n }\n }\n\n error(...args: unknown[]): void {\n this.log('error', ...args);\n }\n warn(...args: unknown[]): void {\n this.log('warn', ...args);\n }\n info(...args: unknown[]): void {\n this.log('info', ...args);\n }\n debug(...args: unknown[]): void {\n this.log('debug', ...args);\n }\n\n private log(level: keyof Logger, ...args: unknown[]) {\n try {\n this.logger[level](...args);\n } catch (error) {\n this.fallbackLogger[level](...args);\n }\n }\n}\n", "import { EvaluationContext, TransactionContextPropagator } from './types';\n\nclass NoopTransactionContextPropagator implements TransactionContextPropagator {\n getTransactionContext(): EvaluationContext {\n return {};\n }\n\n setTransactionContext(_: EvaluationContext, callback: () => void): void {\n callback();\n }\n}\n\nexport const NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();\n", "import { DefaultLogger } from './logger';\nimport { NOOP_TRANSACTION_CONTEXT_PROPAGATOR } from './no-op-transaction-context-propagator';\nimport { EvaluationContext, Logger, TransactionContext, TransactionContextPropagator } from './types';\n\nexport abstract class OpenFeatureCommonAPI {\n protected _transactionContextPropagator: TransactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;\n protected _context: EvaluationContext = {};\n protected _logger: Logger = new DefaultLogger();\n\n // TODO: move close from client to new abstract here when we want close in server.\n abstract clearHooks(): this\n abstract setLogger(logger: Logger): this;\n\n getContext(): EvaluationContext {\n return this._context;\n }\n\n setTransactionContextPropagator(transactionContextPropagator: TransactionContextPropagator): OpenFeatureCommonAPI {\n const baseMessage = 'Invalid TransactionContextPropagator, will not be set: ';\n if (typeof transactionContextPropagator?.getTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);\n } else if (typeof transactionContextPropagator?.setTransactionContext !== 'function') {\n this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);\n } else {\n this._transactionContextPropagator = transactionContextPropagator;\n }\n return this;\n }\n\n setTransactionContext<R>(\n transactionContext: TransactionContext,\n callback: (...args: unknown[]) => R,\n ...args: unknown[]\n ): void {\n this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);\n }\n\n getTransactionContext(): TransactionContext {\n try {\n return this._transactionContextPropagator.getTransactionContext();\n } catch (err: unknown) {\n const error = err as Error | undefined;\n this._logger.error(`Error getting transaction context: ${error?.message}, returning empty context.`);\n this._logger.error(error?.stack);\n return {};\n }\n }\n}", "import { ResolutionDetails, JsonValue } from '@openfeature/shared';\nimport { Provider } from './types';\n\nconst REASON_NO_OP = 'No-op';\n\n/**\n * The No-op provider is set by default, and simply always returns the default value.\n */\nclass NoopFeatureProvider implements Provider {\n readonly metadata = {\n name: 'No-op Provider',\n } as const;\n\n resolveBooleanEvaluation(_: string, defaultValue: boolean): ResolutionDetails<boolean> {\n return this.noOp(defaultValue);\n }\n\n resolveStringEvaluation(_: string, defaultValue: string): ResolutionDetails<string> {\n return this.noOp(defaultValue);\n }\n\n resolveNumberEvaluation(_: string, defaultValue: number): ResolutionDetails<number> {\n return this.noOp(defaultValue);\n }\n\n resolveObjectEvaluation<T extends JsonValue>(_: string, defaultValue: T): ResolutionDetails<T> {\n return this.noOp<T>(defaultValue);\n }\n\n private noOp<T>(defaultValue: T) {\n return {\n value: defaultValue,\n reason: REASON_NO_OP,\n };\n }\n}\n\nexport const NOOP_PROVIDER = new NoopFeatureProvider();\n", "import { NOOP_PROVIDER } from './no-op-provider';\nimport { Logger, OpenFeatureCommonAPI, SafeLogger } from '@openfeature/shared';\nimport { ApiEvents, EvaluationContext, FlagValue, ProviderMetadata } from '@openfeature/shared';\nimport { OpenFeatureClient } from './client';\nimport { Client, Hook, Provider } from './types';\n\n// use a symbol as a key for the global singleton\nconst GLOBAL_OPENFEATURE_API_KEY = Symbol.for('@openfeature/js.api');\n\ntype OpenFeatureGlobal = {\n [GLOBAL_OPENFEATURE_API_KEY]?: OpenFeatureAPI;\n};\nconst _globalThis = globalThis as OpenFeatureGlobal;\n\nexport class OpenFeatureAPI extends OpenFeatureCommonAPI {\n\n protected _hooks: Hook[] = [];\n protected _provider: Provider = NOOP_PROVIDER;\n\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n private constructor() {\n super();\n }\n\n /**\n * Gets a singleton instance of the OpenFeature API.\n *\n * @ignore\n * @returns {OpenFeatureAPI} OpenFeature API\n */\n static getInstance(): OpenFeatureAPI {\n const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];\n if (globalApi) {\n return globalApi;\n }\n\n const instance = new OpenFeatureAPI();\n _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;\n return instance;\n }\n\n /**\n * Get metadata about registered provider.\n *\n * @returns {ProviderMetadata} Provider Metadata\n */\n get providerMetadata(): ProviderMetadata {\n return this._provider.metadata;\n }\n\n setLogger(logger: Logger): this {\n this._logger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): this {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): this {\n this._hooks = [];\n return this;\n }\n\n async setContext(context: EvaluationContext): Promise<void> {\n const oldContext = this._context;\n this._context = context;\n await this._provider?.onContextChange?.(oldContext, context);\n }\n\n setProvider(provider: Provider): OpenFeatureCommonAPI {\n // ignore no-ops\n if (this._provider !== provider) {\n const oldProvider = this._provider;\n this._provider = provider;\n window.dispatchEvent(new CustomEvent(ApiEvents.ProviderChanged));\n oldProvider?.onClose?.();\n }\n return this;\n }\n\n async close(): Promise<void> {\n await this?._provider?.onClose?.();\n }\n\n getClient(name?: string, version?: string, context?: EvaluationContext): Client {\n return new OpenFeatureClient(\n () => this._provider,\n () => this._logger,\n { name, version },\n context\n );\n }\n}\n\n/**\n * A singleton instance of the OpenFeature API.\n *\n * @returns {OpenFeatureAPI} OpenFeature API\n */\nexport const OpenFeature = OpenFeatureAPI.getInstance();\n", "import { OpenFeatureError } from '@openfeature/shared';\nimport { SafeLogger } from '@openfeature/shared';\nimport {\n ApiEvents,\n ClientMetadata,\n ErrorCode, EvaluationContext,\n EvaluationDetails,\n FlagValue,\n FlagValueType,\n Handler,\n HookContext,\n JsonValue,\n Logger,\n ProviderEvents,\n ResolutionDetails,\n StandardResolutionReasons\n} from '@openfeature/shared';\nimport { OpenFeature } from './open-feature';\nimport { Client, EventProvider, FlagEvaluationOptions, Hook, Provider } from './types';\n\ntype OpenFeatureClientOptions = {\n name?: string;\n version?: string;\n};\n\ntype HandlerWrapper = {\n eventType: string;\n handler: Handler;\n}\n\nexport class OpenFeatureClient implements Client {\n readonly metadata: ClientMetadata;\n private _context: EvaluationContext;\n private _hooks: Hook[] = [];\n private _clientLogger?: Logger;\n private _handlerWrappers: HandlerWrapper[] = [];\n\n constructor(\n // we always want the client to use the current provider,\n // so pass a function to always access the currently registered one.\n private readonly providerAccessor: () => Provider & Partial<EventProvider>,\n private readonly globalLogger: () => Logger,\n options: OpenFeatureClientOptions,\n context: EvaluationContext = {}\n ) {\n this.metadata = {\n name: options.name,\n version: options.version,\n } as const;\n this._context = context;\n\n this.attachListeners();\n window.dispatchEvent(new CustomEvent(ApiEvents.ProviderChanged));\n }\n\n addHandler(eventType: ProviderEvents, handler: Handler): void {\n this._handlerWrappers.push({eventType, handler});\n if (eventType === ProviderEvents.Ready && this.providerAccessor().ready) {\n // run immediately, we're ready.\n handler();\n }\n }\n\n setLogger(logger: Logger): OpenFeatureClient {\n this._clientLogger = new SafeLogger(logger);\n return this;\n }\n\n addHooks(...hooks: Hook<FlagValue>[]): OpenFeatureClient {\n this._hooks = [...this._hooks, ...hooks];\n return this;\n }\n\n getHooks(): Hook<FlagValue>[] {\n return this._hooks;\n }\n\n clearHooks(): OpenFeatureClient {\n this._hooks = [];\n return this;\n }\n\n getBooleanValue(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions\n ): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, context, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(\n flagKey,\n this._provider.resolveBooleanEvaluation,\n defaultValue,\n 'boolean',\n context,\n options\n );\n }\n\n getStringValue<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions\n ): T {\n return this.getStringDetails<T>(flagKey, defaultValue, context, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted string generic argument.\n this._provider.resolveStringEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'string',\n context,\n options\n );\n }\n\n getNumberValue<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions\n ): T {\n return this.getNumberDetails(flagKey, defaultValue, context, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(\n flagKey,\n // this isolates providers from our restricted number generic argument.\n this._provider.resolveNumberEvaluation as () => EvaluationDetails<T>,\n defaultValue,\n 'number',\n context,\n options\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, context, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n context?: EvaluationContext,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', context, options);\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n logger: Logger\n ) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\n invocationContext: EvaluationContext = {},\n options: FlagEvaluationOptions = {}\n ): EvaluationDetails<T> {\n // merge global, client, and evaluation context\n\n const allHooks = [\n ...OpenFeature.getHooks(),\n ...this.getHooks(),\n ...(options.hooks || []),\n ...(this._provider.hooks || []),\n ];\n const allHooksReversed = [...allHooks].reverse();\n\n // merge global and client contexts\n const mergedContext = {\n ...OpenFeature.getContext(),\n ...OpenFeature.getTransactionContext(),\n ...this._context,\n ...invocationContext,\n };\n\n // this reference cannot change during the course of evaluation\n // it may be used as a key in WeakMaps\n const hookContext: Readonly<HookContext> = {\n flagKey,\n defaultValue,\n flagValueType: flagType,\n clientMetadata: this.metadata,\n providerMetadata: OpenFeature.providerMetadata,\n context: mergedContext,\n logger: this._logger,\n };\n\n try {\n const frozenContext = this.beforeHooks(allHooks, hookContext, options);\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, frozenContext, this._logger);\n\n const evaluationDetails = {\n ...resolution,\n flagKey,\n };\n\n this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);\n\n return evaluationDetails;\n } catch (err: unknown) {\n const errorMessage: string = (err as Error)?.message;\n const errorCode: ErrorCode = (err as OpenFeatureError)?.code || ErrorCode.GENERAL;\n\n this.errorHooks(allHooksReversed, hookContext, err, options);\n\n return {\n errorCode,\n errorMessage,\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n flagKey,\n };\n } finally {\n this.finallyHooks(allHooksReversed, hookContext, options);\n }\n }\n\n private beforeHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n for (const hook of hooks) {\n // freeze the hookContext\n Object.freeze(hookContext);\n\n // use Object.assign to avoid modification of frozen hookContext\n Object.assign(hookContext.context, {\n ...hookContext.context,\n ...hook?.before?.(hookContext, Object.freeze(options.hookHints)),\n });\n }\n\n // after before hooks, freeze the EvaluationContext.\n return Object.freeze(hookContext.context);\n }\n\n private afterHooks(\n hooks: Hook[],\n hookContext: HookContext,\n evaluationDetails: EvaluationDetails<FlagValue>,\n options: FlagEvaluationOptions\n ) {\n // run \"after\" hooks sequentially\n for (const hook of hooks) {\n hook?.after?.(hookContext, evaluationDetails, options.hookHints);\n }\n }\n\n private errorHooks(hooks: Hook[], hookContext: HookContext, err: unknown, options: FlagEvaluationOptions) {\n // run \"error\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.error?.(hookContext, err, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'error' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private finallyHooks(hooks: Hook[], hookContext: HookContext, options: FlagEvaluationOptions) {\n // run \"finally\" hooks sequentially\n for (const hook of hooks) {\n try {\n hook?.finally?.(hookContext, options.hookHints);\n } catch (err) {\n this._logger.error(`Unhandled error during 'finally' hook: ${err}`);\n if (err instanceof Error) {\n this._logger.error(err.stack);\n }\n this._logger.error((err as Error)?.stack);\n }\n }\n }\n\n private get _provider(): Provider & Partial<EventProvider> {\n return this.providerAccessor();\n }\n\n private get _logger() {\n return this._clientLogger || this.globalLogger();\n }\n\n private attachListeners() {\n // iterate over the event types\n Object.values(ProviderEvents)\n .forEach(eventType => window.addEventListener(eventType, () => {\n // on each event type, fire the associated handlers\n this._handlerWrappers\n .filter(wrapper => wrapper.eventType === eventType)\n .forEach(wrapper => wrapper.handler());\n }));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ProviderEvents", "ApiEvents", "ErrorCode", "err"]
7
+ }
@@ -0,0 +1,578 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defProps = Object.defineProperties;
3
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __spreadValues = (a, b) => {
9
+ for (var prop in b || (b = {}))
10
+ if (__hasOwnProp.call(b, prop))
11
+ __defNormalProp(a, prop, b[prop]);
12
+ if (__getOwnPropSymbols)
13
+ for (var prop of __getOwnPropSymbols(b)) {
14
+ if (__propIsEnum.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ }
17
+ return a;
18
+ };
19
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __async = (__this, __arguments, generator) => {
21
+ return new Promise((resolve, reject) => {
22
+ var fulfilled = (value) => {
23
+ try {
24
+ step(generator.next(value));
25
+ } catch (e) {
26
+ reject(e);
27
+ }
28
+ };
29
+ var rejected = (value) => {
30
+ try {
31
+ step(generator.throw(value));
32
+ } catch (e) {
33
+ reject(e);
34
+ }
35
+ };
36
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
37
+ step((generator = generator.apply(__this, __arguments)).next());
38
+ });
39
+ };
40
+
41
+ // ../shared/src/types.ts
42
+ var ProviderEvents = /* @__PURE__ */ ((ProviderEvents2) => {
43
+ ProviderEvents2["Ready"] = "PROVIDER_READY";
44
+ ProviderEvents2["Error"] = "PROVIDER_ERROR";
45
+ ProviderEvents2["ConfigurationChanged"] = "PROVIDER_CONFIGURATION_CHANGED";
46
+ ProviderEvents2["Shutdown"] = "PROVIDER_SHUTDOWN";
47
+ return ProviderEvents2;
48
+ })(ProviderEvents || {});
49
+ var ApiEvents = /* @__PURE__ */ ((ApiEvents2) => {
50
+ ApiEvents2["ProviderChanged"] = "providerChanged";
51
+ return ApiEvents2;
52
+ })(ApiEvents || {});
53
+ var StandardResolutionReasons = {
54
+ /**
55
+ * The resolved value was the result of a dynamic evaluation, such as a rule or specific user-targeting.
56
+ */
57
+ TARGETING_MATCH: "TARGETING_MATCH",
58
+ /**
59
+ * The resolved value was the result of pseudorandom assignment.
60
+ */
61
+ SPLIT: "SPLIT",
62
+ /**
63
+ * The resolved value was the result of the flag being disabled in the management system.
64
+ */
65
+ DISABLED: "DISABLED",
66
+ /**
67
+ * The resolved value was configured statically, or otherwise fell back to a pre-configured value.
68
+ */
69
+ DEFAULT: "DEFAULT",
70
+ /**
71
+ * The reason for the resolved value could not be determined.
72
+ */
73
+ UNKNOWN: "UNKNOWN",
74
+ /**
75
+ * The resolved value is static (no dynamic evaluation).
76
+ */
77
+ STATIC: "STATIC",
78
+ /**
79
+ * The resolved value was retrieved from cache.
80
+ */
81
+ CACHED: "CACHED",
82
+ /**
83
+ * The resolved value was the result of an error.
84
+ *
85
+ * Note: The `errorCode` and `errorMessage` fields may contain additional details of this error.
86
+ */
87
+ ERROR: "ERROR"
88
+ };
89
+ var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
90
+ ErrorCode2["PROVIDER_NOT_READY"] = "PROVIDER_NOT_READY";
91
+ ErrorCode2["FLAG_NOT_FOUND"] = "FLAG_NOT_FOUND";
92
+ ErrorCode2["PARSE_ERROR"] = "PARSE_ERROR";
93
+ ErrorCode2["TYPE_MISMATCH"] = "TYPE_MISMATCH";
94
+ ErrorCode2["TARGETING_KEY_MISSING"] = "TARGETING_KEY_MISSING";
95
+ ErrorCode2["INVALID_CONTEXT"] = "INVALID_CONTEXT";
96
+ ErrorCode2["GENERAL"] = "GENERAL";
97
+ return ErrorCode2;
98
+ })(ErrorCode || {});
99
+
100
+ // ../shared/src/errors/open-feature-error-abstract.ts
101
+ var OpenFeatureError = class extends Error {
102
+ constructor(message) {
103
+ super(message);
104
+ Object.setPrototypeOf(this, OpenFeatureError.prototype);
105
+ this.name = "OpenFeatureError";
106
+ }
107
+ };
108
+
109
+ // ../shared/src/errors/general-error.ts
110
+ var GeneralError = class extends OpenFeatureError {
111
+ constructor(message) {
112
+ super(message);
113
+ Object.setPrototypeOf(this, GeneralError.prototype);
114
+ this.name = "GeneralError";
115
+ this.code = "GENERAL" /* GENERAL */;
116
+ }
117
+ };
118
+
119
+ // ../shared/src/errors/flag-not-found-error.ts
120
+ var FlagNotFoundError = class extends OpenFeatureError {
121
+ constructor(message) {
122
+ super(message);
123
+ Object.setPrototypeOf(this, FlagNotFoundError.prototype);
124
+ this.name = "FlagNotFoundError";
125
+ this.code = "FLAG_NOT_FOUND" /* FLAG_NOT_FOUND */;
126
+ }
127
+ };
128
+
129
+ // ../shared/src/errors/parse-error.ts
130
+ var ParseError = class extends OpenFeatureError {
131
+ constructor(message) {
132
+ super(message);
133
+ Object.setPrototypeOf(this, ParseError.prototype);
134
+ this.name = "ParseError";
135
+ this.code = "PARSE_ERROR" /* PARSE_ERROR */;
136
+ }
137
+ };
138
+
139
+ // ../shared/src/errors/type-mismatch-error.ts
140
+ var TypeMismatchError = class extends OpenFeatureError {
141
+ constructor(message) {
142
+ super(message);
143
+ Object.setPrototypeOf(this, TypeMismatchError.prototype);
144
+ this.name = "TypeMismatchError";
145
+ this.code = "TYPE_MISMATCH" /* TYPE_MISMATCH */;
146
+ }
147
+ };
148
+
149
+ // ../shared/src/errors/targeting-key-missing-error.ts
150
+ var TargetingKeyMissingError = class extends OpenFeatureError {
151
+ constructor(message) {
152
+ super(message);
153
+ Object.setPrototypeOf(this, TargetingKeyMissingError.prototype);
154
+ this.name = "TargetingKeyMissingError";
155
+ this.code = "TARGETING_KEY_MISSING" /* TARGETING_KEY_MISSING */;
156
+ }
157
+ };
158
+
159
+ // ../shared/src/errors/invalid-context-error.ts
160
+ var InvalidContextError = class extends OpenFeatureError {
161
+ constructor(message) {
162
+ super(message);
163
+ Object.setPrototypeOf(this, InvalidContextError.prototype);
164
+ this.name = "InvalidContextError";
165
+ this.code = "INVALID_CONTEXT" /* INVALID_CONTEXT */;
166
+ }
167
+ };
168
+
169
+ // ../shared/src/logger.ts
170
+ var LOG_LEVELS = ["error", "warn", "info", "debug"];
171
+ var DefaultLogger = class {
172
+ error(...args) {
173
+ console.error(...args);
174
+ }
175
+ warn(...args) {
176
+ console.warn(...args);
177
+ }
178
+ info() {
179
+ }
180
+ debug() {
181
+ }
182
+ };
183
+ var SafeLogger = class {
184
+ constructor(logger) {
185
+ this.fallbackLogger = new DefaultLogger();
186
+ try {
187
+ for (const level of LOG_LEVELS) {
188
+ if (!logger[level] || typeof logger[level] !== "function") {
189
+ throw new Error(`The provided logger is missing the ${level} method.`);
190
+ }
191
+ }
192
+ this.logger = logger;
193
+ } catch (err) {
194
+ console.error(err);
195
+ console.error("Falling back to the default logger.");
196
+ this.logger = this.fallbackLogger;
197
+ }
198
+ }
199
+ error(...args) {
200
+ this.log("error", ...args);
201
+ }
202
+ warn(...args) {
203
+ this.log("warn", ...args);
204
+ }
205
+ info(...args) {
206
+ this.log("info", ...args);
207
+ }
208
+ debug(...args) {
209
+ this.log("debug", ...args);
210
+ }
211
+ log(level, ...args) {
212
+ try {
213
+ this.logger[level](...args);
214
+ } catch (error) {
215
+ this.fallbackLogger[level](...args);
216
+ }
217
+ }
218
+ };
219
+
220
+ // ../shared/src/no-op-transaction-context-propagator.ts
221
+ var NoopTransactionContextPropagator = class {
222
+ getTransactionContext() {
223
+ return {};
224
+ }
225
+ setTransactionContext(_, callback) {
226
+ callback();
227
+ }
228
+ };
229
+ var NOOP_TRANSACTION_CONTEXT_PROPAGATOR = new NoopTransactionContextPropagator();
230
+
231
+ // ../shared/src/open-feature.ts
232
+ var OpenFeatureCommonAPI = class {
233
+ constructor() {
234
+ this._transactionContextPropagator = NOOP_TRANSACTION_CONTEXT_PROPAGATOR;
235
+ this._context = {};
236
+ this._logger = new DefaultLogger();
237
+ }
238
+ getContext() {
239
+ return this._context;
240
+ }
241
+ setTransactionContextPropagator(transactionContextPropagator) {
242
+ const baseMessage = "Invalid TransactionContextPropagator, will not be set: ";
243
+ if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.getTransactionContext) !== "function") {
244
+ this._logger.error(`${baseMessage}: getTransactionContext is not a function.`);
245
+ } else if (typeof (transactionContextPropagator == null ? void 0 : transactionContextPropagator.setTransactionContext) !== "function") {
246
+ this._logger.error(`${baseMessage}: setTransactionContext is not a function.`);
247
+ } else {
248
+ this._transactionContextPropagator = transactionContextPropagator;
249
+ }
250
+ return this;
251
+ }
252
+ setTransactionContext(transactionContext, callback, ...args) {
253
+ this._transactionContextPropagator.setTransactionContext(transactionContext, callback, ...args);
254
+ }
255
+ getTransactionContext() {
256
+ try {
257
+ return this._transactionContextPropagator.getTransactionContext();
258
+ } catch (err) {
259
+ const error = err;
260
+ this._logger.error(`Error getting transaction context: ${error == null ? void 0 : error.message}, returning empty context.`);
261
+ this._logger.error(error == null ? void 0 : error.stack);
262
+ return {};
263
+ }
264
+ }
265
+ };
266
+
267
+ // src/no-op-provider.ts
268
+ var REASON_NO_OP = "No-op";
269
+ var NoopFeatureProvider = class {
270
+ constructor() {
271
+ this.metadata = {
272
+ name: "No-op Provider"
273
+ };
274
+ }
275
+ resolveBooleanEvaluation(_, defaultValue) {
276
+ return this.noOp(defaultValue);
277
+ }
278
+ resolveStringEvaluation(_, defaultValue) {
279
+ return this.noOp(defaultValue);
280
+ }
281
+ resolveNumberEvaluation(_, defaultValue) {
282
+ return this.noOp(defaultValue);
283
+ }
284
+ resolveObjectEvaluation(_, defaultValue) {
285
+ return this.noOp(defaultValue);
286
+ }
287
+ noOp(defaultValue) {
288
+ return {
289
+ value: defaultValue,
290
+ reason: REASON_NO_OP
291
+ };
292
+ }
293
+ };
294
+ var NOOP_PROVIDER = new NoopFeatureProvider();
295
+
296
+ // src/open-feature.ts
297
+ var GLOBAL_OPENFEATURE_API_KEY = Symbol.for("@openfeature/js.api");
298
+ var _globalThis = globalThis;
299
+ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
300
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
301
+ constructor() {
302
+ super();
303
+ this._hooks = [];
304
+ this._provider = NOOP_PROVIDER;
305
+ }
306
+ /**
307
+ * Gets a singleton instance of the OpenFeature API.
308
+ *
309
+ * @ignore
310
+ * @returns {OpenFeatureAPI} OpenFeature API
311
+ */
312
+ static getInstance() {
313
+ const globalApi = _globalThis[GLOBAL_OPENFEATURE_API_KEY];
314
+ if (globalApi) {
315
+ return globalApi;
316
+ }
317
+ const instance = new OpenFeatureAPI();
318
+ _globalThis[GLOBAL_OPENFEATURE_API_KEY] = instance;
319
+ return instance;
320
+ }
321
+ /**
322
+ * Get metadata about registered provider.
323
+ *
324
+ * @returns {ProviderMetadata} Provider Metadata
325
+ */
326
+ get providerMetadata() {
327
+ return this._provider.metadata;
328
+ }
329
+ setLogger(logger) {
330
+ this._logger = new SafeLogger(logger);
331
+ return this;
332
+ }
333
+ addHooks(...hooks) {
334
+ this._hooks = [...this._hooks, ...hooks];
335
+ return this;
336
+ }
337
+ getHooks() {
338
+ return this._hooks;
339
+ }
340
+ clearHooks() {
341
+ this._hooks = [];
342
+ return this;
343
+ }
344
+ setContext(context) {
345
+ return __async(this, null, function* () {
346
+ var _a, _b;
347
+ const oldContext = this._context;
348
+ this._context = context;
349
+ yield (_b = (_a = this._provider) == null ? void 0 : _a.onContextChange) == null ? void 0 : _b.call(_a, oldContext, context);
350
+ });
351
+ }
352
+ setProvider(provider) {
353
+ var _a;
354
+ if (this._provider !== provider) {
355
+ const oldProvider = this._provider;
356
+ this._provider = provider;
357
+ window.dispatchEvent(new CustomEvent("providerChanged" /* ProviderChanged */));
358
+ (_a = oldProvider == null ? void 0 : oldProvider.onClose) == null ? void 0 : _a.call(oldProvider);
359
+ }
360
+ return this;
361
+ }
362
+ close() {
363
+ return __async(this, null, function* () {
364
+ var _a, _b;
365
+ yield (_b = (_a = this == null ? void 0 : this._provider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
366
+ });
367
+ }
368
+ getClient(name, version, context) {
369
+ return new OpenFeatureClient(
370
+ () => this._provider,
371
+ () => this._logger,
372
+ { name, version },
373
+ context
374
+ );
375
+ }
376
+ };
377
+ var OpenFeature = OpenFeatureAPI.getInstance();
378
+
379
+ // src/client.ts
380
+ var OpenFeatureClient = class {
381
+ constructor(providerAccessor, globalLogger, options, context = {}) {
382
+ this.providerAccessor = providerAccessor;
383
+ this.globalLogger = globalLogger;
384
+ this._hooks = [];
385
+ this._handlerWrappers = [];
386
+ this.metadata = {
387
+ name: options.name,
388
+ version: options.version
389
+ };
390
+ this._context = context;
391
+ this.attachListeners();
392
+ window.dispatchEvent(new CustomEvent("providerChanged" /* ProviderChanged */));
393
+ }
394
+ addHandler(eventType, handler) {
395
+ this._handlerWrappers.push({ eventType, handler });
396
+ if (eventType === "PROVIDER_READY" /* Ready */ && this.providerAccessor().ready) {
397
+ handler();
398
+ }
399
+ }
400
+ setLogger(logger) {
401
+ this._clientLogger = new SafeLogger(logger);
402
+ return this;
403
+ }
404
+ addHooks(...hooks) {
405
+ this._hooks = [...this._hooks, ...hooks];
406
+ return this;
407
+ }
408
+ getHooks() {
409
+ return this._hooks;
410
+ }
411
+ clearHooks() {
412
+ this._hooks = [];
413
+ return this;
414
+ }
415
+ getBooleanValue(flagKey, defaultValue, context, options) {
416
+ return this.getBooleanDetails(flagKey, defaultValue, context, options).value;
417
+ }
418
+ getBooleanDetails(flagKey, defaultValue, context, options) {
419
+ return this.evaluate(
420
+ flagKey,
421
+ this._provider.resolveBooleanEvaluation,
422
+ defaultValue,
423
+ "boolean",
424
+ context,
425
+ options
426
+ );
427
+ }
428
+ getStringValue(flagKey, defaultValue, context, options) {
429
+ return this.getStringDetails(flagKey, defaultValue, context, options).value;
430
+ }
431
+ getStringDetails(flagKey, defaultValue, context, options) {
432
+ return this.evaluate(
433
+ flagKey,
434
+ // this isolates providers from our restricted string generic argument.
435
+ this._provider.resolveStringEvaluation,
436
+ defaultValue,
437
+ "string",
438
+ context,
439
+ options
440
+ );
441
+ }
442
+ getNumberValue(flagKey, defaultValue, context, options) {
443
+ return this.getNumberDetails(flagKey, defaultValue, context, options).value;
444
+ }
445
+ getNumberDetails(flagKey, defaultValue, context, options) {
446
+ return this.evaluate(
447
+ flagKey,
448
+ // this isolates providers from our restricted number generic argument.
449
+ this._provider.resolveNumberEvaluation,
450
+ defaultValue,
451
+ "number",
452
+ context,
453
+ options
454
+ );
455
+ }
456
+ getObjectValue(flagKey, defaultValue, context, options) {
457
+ return this.getObjectDetails(flagKey, defaultValue, context, options).value;
458
+ }
459
+ getObjectDetails(flagKey, defaultValue, context, options) {
460
+ return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", context, options);
461
+ }
462
+ evaluate(flagKey, resolver, defaultValue, flagType, invocationContext = {}, options = {}) {
463
+ const allHooks = [
464
+ ...OpenFeature.getHooks(),
465
+ ...this.getHooks(),
466
+ ...options.hooks || [],
467
+ ...this._provider.hooks || []
468
+ ];
469
+ const allHooksReversed = [...allHooks].reverse();
470
+ const mergedContext = __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, OpenFeature.getContext()), OpenFeature.getTransactionContext()), this._context), invocationContext);
471
+ const hookContext = {
472
+ flagKey,
473
+ defaultValue,
474
+ flagValueType: flagType,
475
+ clientMetadata: this.metadata,
476
+ providerMetadata: OpenFeature.providerMetadata,
477
+ context: mergedContext,
478
+ logger: this._logger
479
+ };
480
+ try {
481
+ const frozenContext = this.beforeHooks(allHooks, hookContext, options);
482
+ const resolution = resolver.call(this._provider, flagKey, defaultValue, frozenContext, this._logger);
483
+ const evaluationDetails = __spreadProps(__spreadValues({}, resolution), {
484
+ flagKey
485
+ });
486
+ this.afterHooks(allHooksReversed, hookContext, evaluationDetails, options);
487
+ return evaluationDetails;
488
+ } catch (err) {
489
+ const errorMessage = err == null ? void 0 : err.message;
490
+ const errorCode = (err == null ? void 0 : err.code) || "GENERAL" /* GENERAL */;
491
+ this.errorHooks(allHooksReversed, hookContext, err, options);
492
+ return {
493
+ errorCode,
494
+ errorMessage,
495
+ value: defaultValue,
496
+ reason: StandardResolutionReasons.ERROR,
497
+ flagKey
498
+ };
499
+ } finally {
500
+ this.finallyHooks(allHooksReversed, hookContext, options);
501
+ }
502
+ }
503
+ beforeHooks(hooks, hookContext, options) {
504
+ var _a;
505
+ for (const hook of hooks) {
506
+ Object.freeze(hookContext);
507
+ Object.assign(hookContext.context, __spreadValues(__spreadValues({}, hookContext.context), (_a = hook == null ? void 0 : hook.before) == null ? void 0 : _a.call(hook, hookContext, Object.freeze(options.hookHints))));
508
+ }
509
+ return Object.freeze(hookContext.context);
510
+ }
511
+ afterHooks(hooks, hookContext, evaluationDetails, options) {
512
+ var _a;
513
+ for (const hook of hooks) {
514
+ (_a = hook == null ? void 0 : hook.after) == null ? void 0 : _a.call(hook, hookContext, evaluationDetails, options.hookHints);
515
+ }
516
+ }
517
+ errorHooks(hooks, hookContext, err, options) {
518
+ var _a;
519
+ for (const hook of hooks) {
520
+ try {
521
+ (_a = hook == null ? void 0 : hook.error) == null ? void 0 : _a.call(hook, hookContext, err, options.hookHints);
522
+ } catch (err2) {
523
+ this._logger.error(`Unhandled error during 'error' hook: ${err2}`);
524
+ if (err2 instanceof Error) {
525
+ this._logger.error(err2.stack);
526
+ }
527
+ this._logger.error(err2 == null ? void 0 : err2.stack);
528
+ }
529
+ }
530
+ }
531
+ finallyHooks(hooks, hookContext, options) {
532
+ var _a;
533
+ for (const hook of hooks) {
534
+ try {
535
+ (_a = hook == null ? void 0 : hook.finally) == null ? void 0 : _a.call(hook, hookContext, options.hookHints);
536
+ } catch (err) {
537
+ this._logger.error(`Unhandled error during 'finally' hook: ${err}`);
538
+ if (err instanceof Error) {
539
+ this._logger.error(err.stack);
540
+ }
541
+ this._logger.error(err == null ? void 0 : err.stack);
542
+ }
543
+ }
544
+ }
545
+ get _provider() {
546
+ return this.providerAccessor();
547
+ }
548
+ get _logger() {
549
+ return this._clientLogger || this.globalLogger();
550
+ }
551
+ attachListeners() {
552
+ Object.values(ProviderEvents).forEach((eventType) => window.addEventListener(eventType, () => {
553
+ this._handlerWrappers.filter((wrapper) => wrapper.eventType === eventType).forEach((wrapper) => wrapper.handler());
554
+ }));
555
+ }
556
+ };
557
+ export {
558
+ ApiEvents,
559
+ DefaultLogger,
560
+ ErrorCode,
561
+ FlagNotFoundError,
562
+ GeneralError,
563
+ InvalidContextError,
564
+ NOOP_PROVIDER,
565
+ NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
566
+ OpenFeature,
567
+ OpenFeatureAPI,
568
+ OpenFeatureClient,
569
+ OpenFeatureCommonAPI,
570
+ OpenFeatureError,
571
+ ParseError,
572
+ ProviderEvents,
573
+ SafeLogger,
574
+ StandardResolutionReasons,
575
+ TargetingKeyMissingError,
576
+ TypeMismatchError
577
+ };
578
+ //# sourceMappingURL=index.js.map