@openfeature/web-sdk 0.0.2-experimental → 0.1.0-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.
package/dist/cjs/index.js CHANGED
@@ -406,12 +406,11 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
406
406
  yield (_b = (_a = this == null ? void 0 : this._provider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
407
407
  });
408
408
  }
409
- getClient(name, version, context) {
409
+ getClient(name, version) {
410
410
  return new OpenFeatureClient(
411
411
  () => this._provider,
412
412
  () => this._logger,
413
- { name, version },
414
- context
413
+ { name, version }
415
414
  );
416
415
  }
417
416
  };
@@ -419,7 +418,7 @@ var OpenFeature = OpenFeatureAPI.getInstance();
419
418
 
420
419
  // src/client.ts
421
420
  var OpenFeatureClient = class {
422
- constructor(providerAccessor, globalLogger, options, context = {}) {
421
+ constructor(providerAccessor, globalLogger, options) {
423
422
  this.providerAccessor = providerAccessor;
424
423
  this.globalLogger = globalLogger;
425
424
  this._hooks = [];
@@ -428,7 +427,6 @@ var OpenFeatureClient = class {
428
427
  name: options.name,
429
428
  version: options.version
430
429
  };
431
- this._context = context;
432
430
  this.attachListeners();
433
431
  window.dispatchEvent(new CustomEvent("providerChanged" /* ProviderChanged */));
434
432
  }
@@ -453,54 +451,51 @@ var OpenFeatureClient = class {
453
451
  this._hooks = [];
454
452
  return this;
455
453
  }
456
- getBooleanValue(flagKey, defaultValue, context, options) {
457
- return this.getBooleanDetails(flagKey, defaultValue, context, options).value;
454
+ getBooleanValue(flagKey, defaultValue, options) {
455
+ return this.getBooleanDetails(flagKey, defaultValue, options).value;
458
456
  }
459
- getBooleanDetails(flagKey, defaultValue, context, options) {
457
+ getBooleanDetails(flagKey, defaultValue, options) {
460
458
  return this.evaluate(
461
459
  flagKey,
462
460
  this._provider.resolveBooleanEvaluation,
463
461
  defaultValue,
464
462
  "boolean",
465
- context,
466
463
  options
467
464
  );
468
465
  }
469
- getStringValue(flagKey, defaultValue, context, options) {
470
- return this.getStringDetails(flagKey, defaultValue, context, options).value;
466
+ getStringValue(flagKey, defaultValue, options) {
467
+ return this.getStringDetails(flagKey, defaultValue, options).value;
471
468
  }
472
- getStringDetails(flagKey, defaultValue, context, options) {
469
+ getStringDetails(flagKey, defaultValue, options) {
473
470
  return this.evaluate(
474
471
  flagKey,
475
472
  // this isolates providers from our restricted string generic argument.
476
473
  this._provider.resolveStringEvaluation,
477
474
  defaultValue,
478
475
  "string",
479
- context,
480
476
  options
481
477
  );
482
478
  }
483
- getNumberValue(flagKey, defaultValue, context, options) {
484
- return this.getNumberDetails(flagKey, defaultValue, context, options).value;
479
+ getNumberValue(flagKey, defaultValue, options) {
480
+ return this.getNumberDetails(flagKey, defaultValue, options).value;
485
481
  }
486
- getNumberDetails(flagKey, defaultValue, context, options) {
482
+ getNumberDetails(flagKey, defaultValue, options) {
487
483
  return this.evaluate(
488
484
  flagKey,
489
485
  // this isolates providers from our restricted number generic argument.
490
486
  this._provider.resolveNumberEvaluation,
491
487
  defaultValue,
492
488
  "number",
493
- context,
494
489
  options
495
490
  );
496
491
  }
497
- getObjectValue(flagKey, defaultValue, context, options) {
498
- return this.getObjectDetails(flagKey, defaultValue, context, options).value;
492
+ getObjectValue(flagKey, defaultValue, options) {
493
+ return this.getObjectDetails(flagKey, defaultValue, options).value;
499
494
  }
500
- getObjectDetails(flagKey, defaultValue, context, options) {
501
- return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", context, options);
495
+ getObjectDetails(flagKey, defaultValue, options) {
496
+ return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", options);
502
497
  }
503
- evaluate(flagKey, resolver, defaultValue, flagType, invocationContext = {}, options = {}) {
498
+ evaluate(flagKey, resolver, defaultValue, flagType, options = {}) {
504
499
  const allHooks = [
505
500
  ...OpenFeature.getHooks(),
506
501
  ...this.getHooks(),
@@ -508,19 +503,19 @@ var OpenFeatureClient = class {
508
503
  ...this._provider.hooks || []
509
504
  ];
510
505
  const allHooksReversed = [...allHooks].reverse();
511
- const mergedContext = __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, OpenFeature.getContext()), OpenFeature.getTransactionContext()), this._context), invocationContext);
506
+ const context = __spreadValues({}, OpenFeature.getContext());
512
507
  const hookContext = {
513
508
  flagKey,
514
509
  defaultValue,
515
510
  flagValueType: flagType,
516
511
  clientMetadata: this.metadata,
517
512
  providerMetadata: OpenFeature.providerMetadata,
518
- context: mergedContext,
513
+ context,
519
514
  logger: this._logger
520
515
  };
521
516
  try {
522
- const frozenContext = this.beforeHooks(allHooks, hookContext, options);
523
- const resolution = resolver.call(this._provider, flagKey, defaultValue, frozenContext, this._logger);
517
+ this.beforeHooks(allHooks, hookContext, options);
518
+ const resolution = resolver.call(this._provider, flagKey, defaultValue, this._logger);
524
519
  const evaluationDetails = __spreadProps(__spreadValues({}, resolution), {
525
520
  flagKey
526
521
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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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",
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): Client {\n return new OpenFeatureClient(\n () => this._provider,\n () => this._logger,\n { name, version },\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,\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 _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 ) {\n this.metadata = {\n name: options.name,\n version: options.version,\n } as const;\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 options?: FlagEvaluationOptions\n ): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(\n flagKey,\n this._provider.resolveBooleanEvaluation,\n defaultValue,\n 'boolean',\n options\n );\n }\n\n getStringValue<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\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 options\n );\n }\n\n getNumberValue<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\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 options\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (\n flagKey: string,\n defaultValue: T,\n logger: Logger\n ) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\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 context = {\n ...OpenFeature.getContext(),\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,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, 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
6
  "names": ["ProviderEvents", "ApiEvents", "ErrorCode", "err"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -365,12 +365,11 @@ var OpenFeatureAPI = class extends OpenFeatureCommonAPI {
365
365
  yield (_b = (_a = this == null ? void 0 : this._provider) == null ? void 0 : _a.onClose) == null ? void 0 : _b.call(_a);
366
366
  });
367
367
  }
368
- getClient(name, version, context) {
368
+ getClient(name, version) {
369
369
  return new OpenFeatureClient(
370
370
  () => this._provider,
371
371
  () => this._logger,
372
- { name, version },
373
- context
372
+ { name, version }
374
373
  );
375
374
  }
376
375
  };
@@ -378,7 +377,7 @@ var OpenFeature = OpenFeatureAPI.getInstance();
378
377
 
379
378
  // src/client.ts
380
379
  var OpenFeatureClient = class {
381
- constructor(providerAccessor, globalLogger, options, context = {}) {
380
+ constructor(providerAccessor, globalLogger, options) {
382
381
  this.providerAccessor = providerAccessor;
383
382
  this.globalLogger = globalLogger;
384
383
  this._hooks = [];
@@ -387,7 +386,6 @@ var OpenFeatureClient = class {
387
386
  name: options.name,
388
387
  version: options.version
389
388
  };
390
- this._context = context;
391
389
  this.attachListeners();
392
390
  window.dispatchEvent(new CustomEvent("providerChanged" /* ProviderChanged */));
393
391
  }
@@ -412,54 +410,51 @@ var OpenFeatureClient = class {
412
410
  this._hooks = [];
413
411
  return this;
414
412
  }
415
- getBooleanValue(flagKey, defaultValue, context, options) {
416
- return this.getBooleanDetails(flagKey, defaultValue, context, options).value;
413
+ getBooleanValue(flagKey, defaultValue, options) {
414
+ return this.getBooleanDetails(flagKey, defaultValue, options).value;
417
415
  }
418
- getBooleanDetails(flagKey, defaultValue, context, options) {
416
+ getBooleanDetails(flagKey, defaultValue, options) {
419
417
  return this.evaluate(
420
418
  flagKey,
421
419
  this._provider.resolveBooleanEvaluation,
422
420
  defaultValue,
423
421
  "boolean",
424
- context,
425
422
  options
426
423
  );
427
424
  }
428
- getStringValue(flagKey, defaultValue, context, options) {
429
- return this.getStringDetails(flagKey, defaultValue, context, options).value;
425
+ getStringValue(flagKey, defaultValue, options) {
426
+ return this.getStringDetails(flagKey, defaultValue, options).value;
430
427
  }
431
- getStringDetails(flagKey, defaultValue, context, options) {
428
+ getStringDetails(flagKey, defaultValue, options) {
432
429
  return this.evaluate(
433
430
  flagKey,
434
431
  // this isolates providers from our restricted string generic argument.
435
432
  this._provider.resolveStringEvaluation,
436
433
  defaultValue,
437
434
  "string",
438
- context,
439
435
  options
440
436
  );
441
437
  }
442
- getNumberValue(flagKey, defaultValue, context, options) {
443
- return this.getNumberDetails(flagKey, defaultValue, context, options).value;
438
+ getNumberValue(flagKey, defaultValue, options) {
439
+ return this.getNumberDetails(flagKey, defaultValue, options).value;
444
440
  }
445
- getNumberDetails(flagKey, defaultValue, context, options) {
441
+ getNumberDetails(flagKey, defaultValue, options) {
446
442
  return this.evaluate(
447
443
  flagKey,
448
444
  // this isolates providers from our restricted number generic argument.
449
445
  this._provider.resolveNumberEvaluation,
450
446
  defaultValue,
451
447
  "number",
452
- context,
453
448
  options
454
449
  );
455
450
  }
456
- getObjectValue(flagKey, defaultValue, context, options) {
457
- return this.getObjectDetails(flagKey, defaultValue, context, options).value;
451
+ getObjectValue(flagKey, defaultValue, options) {
452
+ return this.getObjectDetails(flagKey, defaultValue, options).value;
458
453
  }
459
- getObjectDetails(flagKey, defaultValue, context, options) {
460
- return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", context, options);
454
+ getObjectDetails(flagKey, defaultValue, options) {
455
+ return this.evaluate(flagKey, this._provider.resolveObjectEvaluation, defaultValue, "object", options);
461
456
  }
462
- evaluate(flagKey, resolver, defaultValue, flagType, invocationContext = {}, options = {}) {
457
+ evaluate(flagKey, resolver, defaultValue, flagType, options = {}) {
463
458
  const allHooks = [
464
459
  ...OpenFeature.getHooks(),
465
460
  ...this.getHooks(),
@@ -467,19 +462,19 @@ var OpenFeatureClient = class {
467
462
  ...this._provider.hooks || []
468
463
  ];
469
464
  const allHooksReversed = [...allHooks].reverse();
470
- const mergedContext = __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, OpenFeature.getContext()), OpenFeature.getTransactionContext()), this._context), invocationContext);
465
+ const context = __spreadValues({}, OpenFeature.getContext());
471
466
  const hookContext = {
472
467
  flagKey,
473
468
  defaultValue,
474
469
  flagValueType: flagType,
475
470
  clientMetadata: this.metadata,
476
471
  providerMetadata: OpenFeature.providerMetadata,
477
- context: mergedContext,
472
+ context,
478
473
  logger: this._logger
479
474
  };
480
475
  try {
481
- const frozenContext = this.beforeHooks(allHooks, hookContext, options);
482
- const resolution = resolver.call(this._provider, flagKey, defaultValue, frozenContext, this._logger);
476
+ this.beforeHooks(allHooks, hookContext, options);
477
+ const resolution = resolver.call(this._provider, flagKey, defaultValue, this._logger);
483
478
  const evaluationDetails = __spreadProps(__spreadValues({}, resolution), {
484
479
  flagKey
485
480
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../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": ["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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",
4
+ "sourcesContent": ["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): Client {\n return new OpenFeatureClient(\n () => this._provider,\n () => this._logger,\n { name, version },\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,\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 _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 ) {\n this.metadata = {\n name: options.name,\n version: options.version,\n } as const;\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 options?: FlagEvaluationOptions\n ): boolean {\n return this.getBooleanDetails(flagKey, defaultValue, options).value;\n }\n\n getBooleanDetails(\n flagKey: string,\n defaultValue: boolean,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<boolean> {\n return this.evaluate<boolean>(\n flagKey,\n this._provider.resolveBooleanEvaluation,\n defaultValue,\n 'boolean',\n options\n );\n }\n\n getStringValue<T extends string = string>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getStringDetails<T>(flagKey, defaultValue, options).value;\n }\n\n getStringDetails<T extends string = string>(\n flagKey: string,\n defaultValue: T,\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 options\n );\n }\n\n getNumberValue<T extends number = number>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getNumberDetails(flagKey, defaultValue, options).value;\n }\n\n getNumberDetails<T extends number = number>(\n flagKey: string,\n defaultValue: T,\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 options\n );\n }\n\n getObjectValue<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): T {\n return this.getObjectDetails(flagKey, defaultValue, options).value;\n }\n\n getObjectDetails<T extends JsonValue = JsonValue>(\n flagKey: string,\n defaultValue: T,\n options?: FlagEvaluationOptions\n ): EvaluationDetails<T> {\n return this.evaluate<T>(flagKey, this._provider.resolveObjectEvaluation, defaultValue, 'object', options);\n }\n\n private evaluate<T extends FlagValue>(\n flagKey: string,\n resolver: (\n flagKey: string,\n defaultValue: T,\n logger: Logger\n ) => ResolutionDetails<T>,\n defaultValue: T,\n flagType: FlagValueType,\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 context = {\n ...OpenFeature.getContext(),\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,\n logger: this._logger,\n };\n\n try {\n this.beforeHooks(allHooks, hookContext, options);\n\n // run the referenced resolver, binding the provider.\n const resolution = resolver.call(this._provider, flagKey, defaultValue, 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
6
  "names": ["ProviderEvents", "ApiEvents", "ErrorCode", "err"]
7
7
  }
package/dist/types.d.ts CHANGED
@@ -338,19 +338,19 @@ interface Provider extends CommonProvider {
338
338
  /**
339
339
  * Resolve a boolean flag and its evaluation details.
340
340
  */
341
- resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, context: EvaluationContext, logger: Logger): ResolutionDetails<boolean>;
341
+ resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, logger: Logger): ResolutionDetails<boolean>;
342
342
  /**
343
343
  * Resolve a string flag and its evaluation details.
344
344
  */
345
- resolveStringEvaluation(flagKey: string, defaultValue: string, context: EvaluationContext, logger: Logger): ResolutionDetails<string>;
345
+ resolveStringEvaluation(flagKey: string, defaultValue: string, logger: Logger): ResolutionDetails<string>;
346
346
  /**
347
347
  * Resolve a numeric flag and its evaluation details.
348
348
  */
349
- resolveNumberEvaluation(flagKey: string, defaultValue: number, context: EvaluationContext, logger: Logger): ResolutionDetails<number>;
349
+ resolveNumberEvaluation(flagKey: string, defaultValue: number, logger: Logger): ResolutionDetails<number>;
350
350
  /**
351
351
  * Resolve and parse an object flag and its evaluation details.
352
352
  */
353
- resolveObjectEvaluation<T extends JsonValue>(flagKey: string, defaultValue: T, context: EvaluationContext, logger: Logger): ResolutionDetails<T>;
353
+ resolveObjectEvaluation<T extends JsonValue>(flagKey: string, defaultValue: T, logger: Logger): ResolutionDetails<T>;
354
354
  }
355
355
  interface Hook<T extends FlagValue = FlagValue> {
356
356
  /**
@@ -423,93 +423,85 @@ interface Features {
423
423
  *
424
424
  * @param {string} flagKey The flag key uniquely identifies a particular flag
425
425
  * @param {boolean} defaultValue The value returned if an error occurs
426
- * @param {EvaluationContext} context The evaluation context used on an individual flag evaluation
427
426
  * @param {FlagEvaluationOptions} options Additional flag evaluation options
428
427
  * @returns {boolean} Flag evaluation response
429
428
  */
430
- getBooleanValue(flagKey: string, defaultValue: boolean, context?: EvaluationContext, options?: FlagEvaluationOptions): boolean;
429
+ getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean;
431
430
  /**
432
431
  * Performs a flag evaluation that a returns an evaluation details object.
433
432
  *
434
433
  * @param {string} flagKey The flag key uniquely identifies a particular flag
435
434
  * @param {boolean} defaultValue The value returned if an error occurs
436
- * @param {EvaluationContext} context The evaluation context used on an individual flag evaluation
437
435
  * @param {FlagEvaluationOptions} options Additional flag evaluation options
438
436
  * @returns {EvaluationDetails<boolean>} Flag evaluation details response
439
437
  */
440
- getBooleanDetails(flagKey: string, defaultValue: boolean, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<boolean>;
438
+ getBooleanDetails(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): EvaluationDetails<boolean>;
441
439
  /**
442
440
  * Performs a flag evaluation that returns a string.
443
441
  *
444
442
  * @param {string} flagKey The flag key uniquely identifies a particular flag
445
443
  * @template {string} T A optional generic argument constraining the string
446
444
  * @param {T} defaultValue The value returned if an error occurs
447
- * @param {EvaluationContext} context The evaluation context used on an individual flag evaluation
448
445
  * @param {FlagEvaluationOptions} options Additional flag evaluation options
449
446
  * @returns {T} Flag evaluation response
450
447
  */
451
- getStringValue(flagKey: string, defaultValue: string, context?: EvaluationContext, options?: FlagEvaluationOptions): string;
452
- getStringValue<T extends string = string>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): T;
448
+ getStringValue(flagKey: string, defaultValue: string, options?: FlagEvaluationOptions): string;
449
+ getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T;
453
450
  /**
454
451
  * Performs a flag evaluation that a returns an evaluation details object.
455
452
  *
456
453
  * @param {string} flagKey The flag key uniquely identifies a particular flag
457
454
  * @template {string} T A optional generic argument constraining the string
458
455
  * @param {T} defaultValue The value returned if an error occurs
459
- * @param {EvaluationContext} context The evaluation context used on an individual flag evaluation
460
456
  * @param {FlagEvaluationOptions} options Additional flag evaluation options
461
457
  * @returns {EvaluationDetails<T>} Flag evaluation details response
462
458
  */
463
- getStringDetails(flagKey: string, defaultValue: string, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<string>;
464
- getStringDetails<T extends string = string>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<T>;
459
+ getStringDetails(flagKey: string, defaultValue: string, options?: FlagEvaluationOptions): EvaluationDetails<string>;
460
+ getStringDetails<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): EvaluationDetails<T>;
465
461
  /**
466
462
  * Performs a flag evaluation that returns a number.
467
463
  *
468
464
  * @param {string} flagKey The flag key uniquely identifies a particular flag
469
465
  * @template {number} T A optional generic argument constraining the number
470
466
  * @param {T} defaultValue The value returned if an error occurs
471
- * @param {EvaluationContext} context The evaluation context used on an individual flag evaluation
472
467
  * @param {FlagEvaluationOptions} options Additional flag evaluation options
473
468
  * @returns {T} Flag evaluation response
474
469
  */
475
- getNumberValue(flagKey: string, defaultValue: number, context?: EvaluationContext, options?: FlagEvaluationOptions): number;
476
- getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): T;
470
+ getNumberValue(flagKey: string, defaultValue: number, options?: FlagEvaluationOptions): number;
471
+ getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T;
477
472
  /**
478
473
  * Performs a flag evaluation that a returns an evaluation details object.
479
474
  *
480
475
  * @param {string} flagKey The flag key uniquely identifies a particular flag
481
476
  * @template {number} T A optional generic argument constraining the number
482
477
  * @param {T} defaultValue The value returned if an error occurs
483
- * @param {EvaluationContext} context The evaluation context used on an individual flag evaluation
484
478
  * @param {FlagEvaluationOptions} options Additional flag evaluation options
485
479
  * @returns {Promise<EvaluationDetails<T>>} Flag evaluation details response
486
480
  */
487
- getNumberDetails(flagKey: string, defaultValue: number, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<number>;
488
- getNumberDetails<T extends number = number>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<T>;
481
+ getNumberDetails(flagKey: string, defaultValue: number, options?: FlagEvaluationOptions): EvaluationDetails<number>;
482
+ getNumberDetails<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): EvaluationDetails<T>;
489
483
  /**
490
484
  * Performs a flag evaluation that returns an object.
491
485
  *
492
486
  * @param {string} flagKey The flag key uniquely identifies a particular flag
493
487
  * @template {JsonValue} T A optional generic argument describing the structure
494
488
  * @param {T} defaultValue The value returned if an error occurs
495
- * @param {EvaluationContext} context The evaluation context used on an individual flag evaluation
496
489
  * @param {FlagEvaluationOptions} options Additional flag evaluation options
497
490
  * @returns {Promise<T>} Flag evaluation response
498
491
  */
499
- getObjectValue(flagKey: string, defaultValue: JsonValue, context?: EvaluationContext, options?: FlagEvaluationOptions): JsonValue;
500
- getObjectValue<T extends JsonValue = JsonValue>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): T;
492
+ getObjectValue(flagKey: string, defaultValue: JsonValue, options?: FlagEvaluationOptions): JsonValue;
493
+ getObjectValue<T extends JsonValue = JsonValue>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T;
501
494
  /**
502
495
  * Performs a flag evaluation that a returns an evaluation details object.
503
496
  *
504
497
  * @param {string} flagKey The flag key uniquely identifies a particular flag
505
498
  * @template {JsonValue} T A optional generic argument describing the structure
506
499
  * @param {T} defaultValue The value returned if an error occurs
507
- * @param {EvaluationContext} context The evaluation context used on an individual flag evaluation
508
500
  * @param {FlagEvaluationOptions} options Additional flag evaluation options
509
501
  * @returns {Promise<EvaluationDetails<T>>} Flag evaluation details response
510
502
  */
511
- getObjectDetails(flagKey: string, defaultValue: JsonValue, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<JsonValue>;
512
- getObjectDetails<T extends JsonValue = JsonValue>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<T>;
503
+ getObjectDetails(flagKey: string, defaultValue: JsonValue, options?: FlagEvaluationOptions): EvaluationDetails<JsonValue>;
504
+ getObjectDetails<T extends JsonValue = JsonValue>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): EvaluationDetails<T>;
513
505
  }
514
506
  interface Client extends EvaluationLifeCycle<Client>, Features, ManageLogger<Client>, Eventing {
515
507
  readonly metadata: ClientMetadata;
@@ -548,24 +540,23 @@ declare class OpenFeatureClient implements Client {
548
540
  private readonly providerAccessor;
549
541
  private readonly globalLogger;
550
542
  readonly metadata: ClientMetadata;
551
- private _context;
552
543
  private _hooks;
553
544
  private _clientLogger?;
554
545
  private _handlerWrappers;
555
- constructor(providerAccessor: () => Provider & Partial<EventProvider>, globalLogger: () => Logger, options: OpenFeatureClientOptions, context?: EvaluationContext);
546
+ constructor(providerAccessor: () => Provider & Partial<EventProvider>, globalLogger: () => Logger, options: OpenFeatureClientOptions);
556
547
  addHandler(eventType: ProviderEvents, handler: Handler): void;
557
548
  setLogger(logger: Logger): OpenFeatureClient;
558
549
  addHooks(...hooks: Hook<FlagValue>[]): OpenFeatureClient;
559
550
  getHooks(): Hook<FlagValue>[];
560
551
  clearHooks(): OpenFeatureClient;
561
- getBooleanValue(flagKey: string, defaultValue: boolean, context?: EvaluationContext, options?: FlagEvaluationOptions): boolean;
562
- getBooleanDetails(flagKey: string, defaultValue: boolean, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<boolean>;
563
- getStringValue<T extends string = string>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): T;
564
- getStringDetails<T extends string = string>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<T>;
565
- getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): T;
566
- getNumberDetails<T extends number = number>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<T>;
567
- getObjectValue<T extends JsonValue = JsonValue>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): T;
568
- getObjectDetails<T extends JsonValue = JsonValue>(flagKey: string, defaultValue: T, context?: EvaluationContext, options?: FlagEvaluationOptions): EvaluationDetails<T>;
552
+ getBooleanValue(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): boolean;
553
+ getBooleanDetails(flagKey: string, defaultValue: boolean, options?: FlagEvaluationOptions): EvaluationDetails<boolean>;
554
+ getStringValue<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T;
555
+ getStringDetails<T extends string = string>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): EvaluationDetails<T>;
556
+ getNumberValue<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T;
557
+ getNumberDetails<T extends number = number>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): EvaluationDetails<T>;
558
+ getObjectValue<T extends JsonValue = JsonValue>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): T;
559
+ getObjectDetails<T extends JsonValue = JsonValue>(flagKey: string, defaultValue: T, options?: FlagEvaluationOptions): EvaluationDetails<T>;
569
560
  private evaluate;
570
561
  private beforeHooks;
571
562
  private afterHooks;
@@ -615,7 +606,7 @@ declare class OpenFeatureAPI extends OpenFeatureCommonAPI {
615
606
  setContext(context: EvaluationContext): Promise<void>;
616
607
  setProvider(provider: Provider): OpenFeatureCommonAPI;
617
608
  close(): Promise<void>;
618
- getClient(name?: string, version?: string, context?: EvaluationContext): Client;
609
+ getClient(name?: string, version?: string): Client;
619
610
  }
620
611
  /**
621
612
  * A singleton instance of the OpenFeature API.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openfeature/web-sdk",
3
- "version": "0.0.2-experimental",
3
+ "version": "0.1.0-experimental",
4
4
  "description": "OpenFeature SDK for Web",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "files": [