@showwhat/openfeature 1.0.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Gerald Yeo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # @showwhat/openfeature
2
+
3
+ [OpenFeature](https://openfeature.dev/) provider for **showwhat** - use showwhat's rule engine through the standard OpenFeature Server SDK.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install showwhat @showwhat/openfeature @openfeature/server-sdk
9
+ ```
10
+
11
+ `@openfeature/server-sdk` is a peer dependency.
12
+
13
+ ## Quick start
14
+
15
+ ```ts
16
+ import { OpenFeature } from "@openfeature/server-sdk";
17
+ import { ShowwhatProvider } from "@showwhat/openfeature";
18
+ import { MemoryData } from "showwhat";
19
+
20
+ const data = await MemoryData.fromYaml(yamlString);
21
+
22
+ await OpenFeature.setProviderAndWait(new ShowwhatProvider({ data }));
23
+
24
+ const client = OpenFeature.getClient();
25
+
26
+ const enabled = await client.getBooleanValue("checkout_v2", false, {
27
+ env: "production",
28
+ });
29
+ ```
30
+
31
+ ## Features
32
+
33
+ - All four evaluation types: boolean, string, number, object
34
+ - Automatic context mapping from OpenFeature to showwhat
35
+ - Custom condition support via `evaluators` option
36
+ - Lifecycle management (`initialize` / `onClose`)
37
+ - Error mapping to OpenFeature error codes
38
+ - Resolution reason tracking
39
+
40
+ ## Documentation
41
+
42
+ - [OpenFeature Integration](https://showwhat.yeojz.dev/docs/openfeature) - provider options, context mapping, evaluation types, error mapping, and lifecycle
@@ -0,0 +1,32 @@
1
+ import { Provider, EvaluationContext, ResolutionDetails, JsonValue } from '@openfeature/server-sdk';
2
+ import { DefinitionReader, ConditionEvaluators, Logger, Context } from 'showwhat';
3
+
4
+ type ShowwhatProviderOptions = {
5
+ data: DefinitionReader;
6
+ evaluators?: ConditionEvaluators;
7
+ logger?: Logger;
8
+ };
9
+ declare class ShowwhatProvider implements Provider {
10
+ #private;
11
+ readonly metadata: {
12
+ readonly name: "showwhat";
13
+ };
14
+ readonly runsOn: "server";
15
+ constructor(options: ShowwhatProviderOptions);
16
+ initialize(): Promise<void>;
17
+ onClose(): Promise<void>;
18
+ resolveBooleanEvaluation(flagKey: string, defaultValue: boolean, context: EvaluationContext): Promise<ResolutionDetails<boolean>>;
19
+ resolveStringEvaluation(flagKey: string, defaultValue: string, context: EvaluationContext): Promise<ResolutionDetails<string>>;
20
+ resolveNumberEvaluation(flagKey: string, defaultValue: number, context: EvaluationContext): Promise<ResolutionDetails<number>>;
21
+ resolveObjectEvaluation<T extends JsonValue>(flagKey: string, defaultValue: T, context: EvaluationContext): Promise<ResolutionDetails<T>>;
22
+ }
23
+
24
+ /**
25
+ * Converts an OpenFeature EvaluationContext into a showwhat Context.
26
+ *
27
+ * Primitives, primitive arrays, and nested objects of primitives are preserved.
28
+ * Date and null values are dropped with a warning.
29
+ */
30
+ declare function toShowwhatContext(evalCtx: EvaluationContext, logger?: Logger): Context;
31
+
32
+ export { ShowwhatProvider, type ShowwhatProviderOptions, toShowwhatContext };
package/dist/index.js ADDED
@@ -0,0 +1,178 @@
1
+ // src/provider.ts
2
+ import { ErrorCode as ErrorCode2, StandardResolutionReasons } from "@openfeature/server-sdk";
3
+ import { showwhat } from "showwhat";
4
+
5
+ // src/context.ts
6
+ import { noopLogger } from "showwhat";
7
+ function convertValue(value) {
8
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
9
+ return value;
10
+ }
11
+ if (Array.isArray(value)) {
12
+ const result = [];
13
+ for (const item of value) {
14
+ if (typeof item === "string" || typeof item === "number" || typeof item === "boolean") {
15
+ result.push(item);
16
+ } else {
17
+ return void 0;
18
+ }
19
+ }
20
+ return result;
21
+ }
22
+ if (value !== null && typeof value === "object" && !(value instanceof Date)) {
23
+ const result = {};
24
+ for (const [k, v] of Object.entries(value)) {
25
+ const converted = convertValue(v);
26
+ if (converted === void 0) {
27
+ return void 0;
28
+ }
29
+ result[k] = converted;
30
+ }
31
+ return result;
32
+ }
33
+ return void 0;
34
+ }
35
+ function toShowwhatContext(evalCtx, logger) {
36
+ const log = logger ?? noopLogger;
37
+ const ctx = {};
38
+ for (const [key, value] of Object.entries(evalCtx)) {
39
+ const converted = convertValue(value);
40
+ if (converted !== void 0) {
41
+ ctx[key] = converted;
42
+ } else {
43
+ log.warn("dropped unsupported context key", { key });
44
+ }
45
+ }
46
+ return ctx;
47
+ }
48
+
49
+ // src/errors.ts
50
+ import { ErrorCode } from "@openfeature/server-sdk";
51
+ import {
52
+ DefinitionNotFoundError,
53
+ DefinitionInactiveError,
54
+ VariationNotFoundError,
55
+ ValidationError,
56
+ DataError,
57
+ ShowwhatError
58
+ } from "showwhat";
59
+ function mapShowwhatError(error) {
60
+ if (error instanceof DefinitionNotFoundError) {
61
+ return { errorCode: ErrorCode.FLAG_NOT_FOUND, errorMessage: error.message };
62
+ }
63
+ if (error instanceof DefinitionInactiveError) {
64
+ return { errorCode: ErrorCode.FLAG_NOT_FOUND, errorMessage: error.message };
65
+ }
66
+ if (error instanceof VariationNotFoundError) {
67
+ return { errorCode: ErrorCode.GENERAL, errorMessage: error.message };
68
+ }
69
+ if (error instanceof ValidationError) {
70
+ return { errorCode: ErrorCode.INVALID_CONTEXT, errorMessage: error.message };
71
+ }
72
+ if (error instanceof DataError) {
73
+ return { errorCode: ErrorCode.GENERAL, errorMessage: error.message };
74
+ }
75
+ if (error instanceof ShowwhatError) {
76
+ return { errorCode: ErrorCode.GENERAL, errorMessage: error.message };
77
+ }
78
+ const message = error instanceof Error ? error.message : String(error);
79
+ return { errorCode: ErrorCode.GENERAL, errorMessage: message };
80
+ }
81
+
82
+ // src/provider.ts
83
+ var ShowwhatProvider = class {
84
+ metadata = { name: "showwhat" };
85
+ runsOn = "server";
86
+ #data;
87
+ #evaluators;
88
+ #logger;
89
+ constructor(options) {
90
+ this.#data = options.data;
91
+ this.#evaluators = options.evaluators;
92
+ this.#logger = options.logger;
93
+ }
94
+ async initialize() {
95
+ if (this.#data.load) {
96
+ await this.#data.load();
97
+ }
98
+ }
99
+ async onClose() {
100
+ if (this.#data.close) {
101
+ await this.#data.close();
102
+ }
103
+ }
104
+ async resolveBooleanEvaluation(flagKey, defaultValue, context) {
105
+ return this.#resolve(
106
+ flagKey,
107
+ defaultValue,
108
+ context,
109
+ (v) => typeof v === "boolean"
110
+ );
111
+ }
112
+ async resolveStringEvaluation(flagKey, defaultValue, context) {
113
+ return this.#resolve(flagKey, defaultValue, context, (v) => typeof v === "string");
114
+ }
115
+ async resolveNumberEvaluation(flagKey, defaultValue, context) {
116
+ return this.#resolve(flagKey, defaultValue, context, (v) => typeof v === "number");
117
+ }
118
+ async resolveObjectEvaluation(flagKey, defaultValue, context) {
119
+ return this.#resolve(
120
+ flagKey,
121
+ defaultValue,
122
+ context,
123
+ isJsonValue
124
+ );
125
+ }
126
+ async #resolve(flagKey, defaultValue, evalCtx, typeGuard) {
127
+ const ctx = toShowwhatContext(evalCtx, this.#logger);
128
+ try {
129
+ const resolution = await showwhat({
130
+ key: flagKey,
131
+ context: ctx,
132
+ options: {
133
+ data: this.#data,
134
+ evaluators: this.#evaluators,
135
+ logger: this.#logger
136
+ }
137
+ });
138
+ const value = resolution.value;
139
+ if (!typeGuard(value)) {
140
+ return {
141
+ value: defaultValue,
142
+ reason: StandardResolutionReasons.ERROR,
143
+ errorCode: ErrorCode2.TYPE_MISMATCH,
144
+ errorMessage: `Flag "${flagKey}" resolved to ${typeof value}, expected a compatible type`
145
+ };
146
+ }
147
+ const hasConditions = resolution.meta.variation.conditionCount > 0;
148
+ return {
149
+ value,
150
+ variant: resolution.meta.variation.id ?? String(resolution.meta.variation.index),
151
+ reason: hasConditions ? StandardResolutionReasons.TARGETING_MATCH : StandardResolutionReasons.STATIC
152
+ };
153
+ } catch (error) {
154
+ const mapped = mapShowwhatError(error);
155
+ return {
156
+ value: defaultValue,
157
+ reason: StandardResolutionReasons.ERROR,
158
+ errorCode: mapped.errorCode,
159
+ errorMessage: mapped.errorMessage
160
+ };
161
+ }
162
+ }
163
+ };
164
+ function isJsonValue(value) {
165
+ if (value === null) return true;
166
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
167
+ return true;
168
+ if (Array.isArray(value)) return value.every(isJsonValue);
169
+ if (typeof value === "object") {
170
+ return Object.values(value).every(isJsonValue);
171
+ }
172
+ return false;
173
+ }
174
+ export {
175
+ ShowwhatProvider,
176
+ toShowwhatContext
177
+ };
178
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider.ts","../src/context.ts","../src/errors.ts"],"sourcesContent":["import type {\n EvaluationContext,\n JsonValue,\n Provider,\n ResolutionDetails,\n} from \"@openfeature/server-sdk\";\nimport { ErrorCode, StandardResolutionReasons } from \"@openfeature/server-sdk\";\nimport type { ConditionEvaluators, DefinitionReader, Logger } from \"showwhat\";\nimport { showwhat } from \"showwhat\";\nimport { toShowwhatContext } from \"./context.js\";\nimport { mapShowwhatError } from \"./errors.js\";\n\nexport type ShowwhatProviderOptions = {\n data: DefinitionReader;\n evaluators?: ConditionEvaluators;\n logger?: Logger;\n};\n\nexport class ShowwhatProvider implements Provider {\n readonly metadata = { name: \"showwhat\" } as const;\n readonly runsOn = \"server\" as const;\n\n #data: DefinitionReader;\n #evaluators: ConditionEvaluators | undefined;\n #logger: Logger | undefined;\n\n constructor(options: ShowwhatProviderOptions) {\n this.#data = options.data;\n this.#evaluators = options.evaluators;\n this.#logger = options.logger;\n }\n\n async initialize(): Promise<void> {\n if (this.#data.load) {\n await this.#data.load();\n }\n }\n\n async onClose(): Promise<void> {\n if (this.#data.close) {\n await this.#data.close();\n }\n }\n\n async resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<boolean>> {\n return this.#resolve(\n flagKey,\n defaultValue,\n context,\n (v): v is boolean => typeof v === \"boolean\",\n );\n }\n\n async resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<string>> {\n return this.#resolve(flagKey, defaultValue, context, (v): v is string => typeof v === \"string\");\n }\n\n async resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<number>> {\n return this.#resolve(flagKey, defaultValue, context, (v): v is number => typeof v === \"number\");\n }\n\n async resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<T>> {\n return this.#resolve(\n flagKey,\n defaultValue,\n context,\n isJsonValue as (value: unknown) => value is T,\n );\n }\n\n async #resolve<T>(\n flagKey: string,\n defaultValue: T,\n evalCtx: EvaluationContext,\n typeGuard: (value: unknown) => value is T,\n ): Promise<ResolutionDetails<T>> {\n const ctx = toShowwhatContext(evalCtx, this.#logger);\n\n try {\n const resolution = await showwhat({\n key: flagKey,\n context: ctx,\n options: {\n data: this.#data,\n evaluators: this.#evaluators,\n logger: this.#logger,\n },\n });\n\n const value = resolution.value;\n\n if (!typeGuard(value)) {\n return {\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n errorCode: ErrorCode.TYPE_MISMATCH,\n errorMessage: `Flag \"${flagKey}\" resolved to ${typeof value}, expected a compatible type`,\n };\n }\n\n const hasConditions = resolution.meta.variation.conditionCount > 0;\n\n return {\n value,\n variant: resolution.meta.variation.id ?? String(resolution.meta.variation.index),\n reason: hasConditions\n ? StandardResolutionReasons.TARGETING_MATCH\n : StandardResolutionReasons.STATIC,\n };\n } catch (error: unknown) {\n const mapped = mapShowwhatError(error);\n return {\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n errorCode: mapped.errorCode,\n errorMessage: mapped.errorMessage,\n };\n }\n }\n}\n\nfunction isJsonValue(value: unknown): value is JsonValue {\n if (value === null) return true;\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\")\n return true;\n if (Array.isArray(value)) return value.every(isJsonValue);\n if (typeof value === \"object\") {\n return Object.values(value as Record<string, unknown>).every(isJsonValue);\n }\n return false;\n}\n","import type { EvaluationContext, EvaluationContextValue } from \"@openfeature/server-sdk\";\nimport type { Context, ContextValue, Logger } from \"showwhat\";\nimport { noopLogger } from \"showwhat\";\n\n/**\n * Converts an OpenFeature EvaluationContextValue to a showwhat ContextValue.\n *\n * Primitives, primitive arrays, and nested objects of primitives are preserved.\n * Date and null values are not representable in JSON/YAML and are dropped.\n */\nfunction convertValue(value: EvaluationContextValue): ContextValue | undefined {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n const result: (string | number | boolean)[] = [];\n for (const item of value) {\n if (typeof item === \"string\" || typeof item === \"number\" || typeof item === \"boolean\") {\n result.push(item);\n } else {\n return undefined;\n }\n }\n return result;\n }\n\n if (value !== null && typeof value === \"object\" && !(value instanceof Date)) {\n const result: Record<string, ContextValue> = {};\n for (const [k, v] of Object.entries(value)) {\n const converted = convertValue(v);\n if (converted === undefined) {\n return undefined;\n }\n result[k] = converted;\n }\n return result;\n }\n\n return undefined;\n}\n\n/**\n * Converts an OpenFeature EvaluationContext into a showwhat Context.\n *\n * Primitives, primitive arrays, and nested objects of primitives are preserved.\n * Date and null values are dropped with a warning.\n */\nexport function toShowwhatContext(evalCtx: EvaluationContext, logger?: Logger): Context {\n const log = logger ?? noopLogger;\n const ctx: Context = {};\n\n for (const [key, value] of Object.entries(evalCtx)) {\n const converted = convertValue(value);\n if (converted !== undefined) {\n ctx[key] = converted;\n } else {\n log.warn(\"dropped unsupported context key\", { key });\n }\n }\n\n return ctx;\n}\n","import { ErrorCode } from \"@openfeature/server-sdk\";\nimport {\n DefinitionNotFoundError,\n DefinitionInactiveError,\n VariationNotFoundError,\n ValidationError,\n DataError,\n ShowwhatError,\n} from \"showwhat\";\n\ntype ErrorMapping = {\n errorCode: ErrorCode;\n errorMessage: string;\n};\n\nexport function mapShowwhatError(error: unknown): ErrorMapping {\n if (error instanceof DefinitionNotFoundError) {\n return { errorCode: ErrorCode.FLAG_NOT_FOUND, errorMessage: error.message };\n }\n\n if (error instanceof DefinitionInactiveError) {\n return { errorCode: ErrorCode.FLAG_NOT_FOUND, errorMessage: error.message };\n }\n\n if (error instanceof VariationNotFoundError) {\n return { errorCode: ErrorCode.GENERAL, errorMessage: error.message };\n }\n\n if (error instanceof ValidationError) {\n return { errorCode: ErrorCode.INVALID_CONTEXT, errorMessage: error.message };\n }\n\n if (error instanceof DataError) {\n return { errorCode: ErrorCode.GENERAL, errorMessage: error.message };\n }\n\n if (error instanceof ShowwhatError) {\n return { errorCode: ErrorCode.GENERAL, errorMessage: error.message };\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { errorCode: ErrorCode.GENERAL, errorMessage: message };\n}\n"],"mappings":"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","names":["ErrorCode","ErrorCode"]}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@showwhat/openfeature",
3
+ "version": "1.0.0",
4
+ "description": "OpenFeature provider for showwhat",
5
+ "keywords": [
6
+ "feature-flags",
7
+ "openfeature",
8
+ "openfeature-provider",
9
+ "feature-management",
10
+ "showwhat"
11
+ ],
12
+ "license": "MIT",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/yeojz/showwhat.git",
16
+ "directory": "packages/openfeature"
17
+ },
18
+ "homepage": "https://showwhat.yeojz.dev",
19
+ "bugs": {
20
+ "url": "https://github.com/yeojz/showwhat/issues"
21
+ },
22
+ "type": "module",
23
+ "main": "./dist/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/index.d.ts",
28
+ "import": "./dist/index.js"
29
+ }
30
+ },
31
+ "engines": {
32
+ "node": ">=22.0.0"
33
+ },
34
+ "files": [
35
+ "dist"
36
+ ],
37
+ "dependencies": {
38
+ "showwhat": "1.0.0"
39
+ },
40
+ "peerDependencies": {
41
+ "@openfeature/server-sdk": "^1.0.0"
42
+ },
43
+ "devDependencies": {
44
+ "@openfeature/server-sdk": "^1.20.0",
45
+ "@types/node": "^25.4.0",
46
+ "@vitest/coverage-v8": "^4.0.0",
47
+ "tsup": "^8.0.0",
48
+ "typescript": "^5.4.0",
49
+ "vitest": "^4.0.0"
50
+ },
51
+ "scripts": {
52
+ "build": "tsup",
53
+ "clean": "rm -rf dist .tsbuildinfo",
54
+ "lint": "eslint src",
55
+ "test": "vitest run --coverage",
56
+ "typecheck": "tsc --noEmit"
57
+ }
58
+ }