@vercel/flags-core 0.1.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.md +21 -0
- package/README.md +1 -0
- package/dist/chunk-IUKV6LEY.js +565 -0
- package/dist/chunk-IUKV6LEY.js.map +1 -0
- package/dist/client-H1UIDKJU.d.ts +421 -0
- package/dist/index.d.ts +64 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/openfeature.d.ts +24 -0
- package/dist/openfeature.js +151 -0
- package/dist/openfeature.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createClientFromConnectionString
|
|
3
|
+
} from "./chunk-IUKV6LEY.js";
|
|
4
|
+
|
|
5
|
+
// src/openfeature.ts
|
|
6
|
+
import {
|
|
7
|
+
ErrorCode,
|
|
8
|
+
StandardResolutionReasons
|
|
9
|
+
} from "@openfeature/server-sdk";
|
|
10
|
+
function mapReason(reason) {
|
|
11
|
+
switch (reason) {
|
|
12
|
+
case "error" /* ERROR */:
|
|
13
|
+
return StandardResolutionReasons.ERROR;
|
|
14
|
+
case "paused" /* PAUSED */:
|
|
15
|
+
return StandardResolutionReasons.STATIC;
|
|
16
|
+
case "fallthrough" /* FALLTHROUGH */:
|
|
17
|
+
return StandardResolutionReasons.DEFAULT;
|
|
18
|
+
case "target_match" /* TARGET_MATCH */:
|
|
19
|
+
case "rule_match" /* RULE_MATCH */:
|
|
20
|
+
return StandardResolutionReasons.TARGETING_MATCH;
|
|
21
|
+
default:
|
|
22
|
+
return StandardResolutionReasons.UNKNOWN;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
var VercelProvider = class {
|
|
26
|
+
metadata = {
|
|
27
|
+
name: "vercel-nodejs-provider"
|
|
28
|
+
};
|
|
29
|
+
runsOn = "server";
|
|
30
|
+
client;
|
|
31
|
+
constructor(clientOrConnectionString) {
|
|
32
|
+
if (typeof clientOrConnectionString === "string") {
|
|
33
|
+
this.client = createClientFromConnectionString(clientOrConnectionString);
|
|
34
|
+
} else {
|
|
35
|
+
this.client = clientOrConnectionString;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async initialize(context) {
|
|
39
|
+
await this.client.initialize();
|
|
40
|
+
}
|
|
41
|
+
async onClose() {
|
|
42
|
+
await this.client.shutdown();
|
|
43
|
+
}
|
|
44
|
+
async resolveBooleanEvaluation(flagKey, defaultValue, context) {
|
|
45
|
+
const result = await this.client.evaluate(
|
|
46
|
+
flagKey,
|
|
47
|
+
defaultValue,
|
|
48
|
+
context
|
|
49
|
+
);
|
|
50
|
+
if (result.reason === "error" /* ERROR */) {
|
|
51
|
+
return {
|
|
52
|
+
value: defaultValue,
|
|
53
|
+
reason: StandardResolutionReasons.ERROR,
|
|
54
|
+
errorCode: ErrorCode.GENERAL,
|
|
55
|
+
errorMessage: result.errorMessage
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (typeof result.value !== "boolean") {
|
|
59
|
+
return {
|
|
60
|
+
value: defaultValue,
|
|
61
|
+
reason: StandardResolutionReasons.ERROR,
|
|
62
|
+
errorCode: ErrorCode.TYPE_MISMATCH,
|
|
63
|
+
errorMessage: `Expected boolean value for flag "${flagKey}"`
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
value: result.value,
|
|
68
|
+
reason: mapReason(result.reason)
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async resolveStringEvaluation(flagKey, defaultValue, context) {
|
|
72
|
+
const result = await this.client.evaluate(
|
|
73
|
+
flagKey,
|
|
74
|
+
defaultValue,
|
|
75
|
+
context
|
|
76
|
+
);
|
|
77
|
+
if (result.reason === "error" /* ERROR */) {
|
|
78
|
+
return {
|
|
79
|
+
value: defaultValue,
|
|
80
|
+
reason: StandardResolutionReasons.ERROR,
|
|
81
|
+
errorCode: ErrorCode.GENERAL,
|
|
82
|
+
errorMessage: result.errorMessage
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (typeof result.value !== "string") {
|
|
86
|
+
return {
|
|
87
|
+
value: defaultValue,
|
|
88
|
+
reason: StandardResolutionReasons.ERROR,
|
|
89
|
+
errorCode: ErrorCode.TYPE_MISMATCH,
|
|
90
|
+
errorMessage: `Expected string value for flag "${flagKey}"`
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
value: result.value,
|
|
95
|
+
reason: mapReason(result.reason),
|
|
96
|
+
errorMessage: result.errorMessage
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async resolveNumberEvaluation(flagKey, defaultValue, context) {
|
|
100
|
+
const result = await this.client.evaluate(
|
|
101
|
+
flagKey,
|
|
102
|
+
defaultValue,
|
|
103
|
+
context
|
|
104
|
+
);
|
|
105
|
+
if (result.reason === "error" /* ERROR */) {
|
|
106
|
+
return {
|
|
107
|
+
value: defaultValue,
|
|
108
|
+
reason: StandardResolutionReasons.ERROR,
|
|
109
|
+
errorCode: ErrorCode.GENERAL,
|
|
110
|
+
errorMessage: result.errorMessage
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (typeof result.value !== "number") {
|
|
114
|
+
return {
|
|
115
|
+
value: defaultValue,
|
|
116
|
+
reason: StandardResolutionReasons.ERROR,
|
|
117
|
+
errorCode: ErrorCode.TYPE_MISMATCH,
|
|
118
|
+
errorMessage: `Expected number value for flag "${flagKey}"`
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
value: result.value,
|
|
123
|
+
reason: mapReason(result.reason),
|
|
124
|
+
errorMessage: result.errorMessage
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
async resolveObjectEvaluation(flagKey, defaultValue, context) {
|
|
128
|
+
const result = await this.client.evaluate(
|
|
129
|
+
flagKey,
|
|
130
|
+
defaultValue,
|
|
131
|
+
context
|
|
132
|
+
);
|
|
133
|
+
if (result.reason === "error" /* ERROR */) {
|
|
134
|
+
return {
|
|
135
|
+
value: defaultValue,
|
|
136
|
+
reason: StandardResolutionReasons.ERROR,
|
|
137
|
+
errorCode: ErrorCode.GENERAL,
|
|
138
|
+
errorMessage: result.errorMessage
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
value: result.value,
|
|
143
|
+
reason: mapReason(result.reason),
|
|
144
|
+
errorMessage: result.errorMessage
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
export {
|
|
149
|
+
VercelProvider
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=openfeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/openfeature.ts"],"sourcesContent":["import {\n ErrorCode,\n type EvaluationContext,\n type JsonValue,\n type Provider,\n type ProviderMetadata,\n type ResolutionDetails,\n type ResolutionReason,\n StandardResolutionReasons,\n} from '@openfeature/server-sdk';\nimport { createClientFromConnectionString, Reason } from '.';\nimport type { FlagsClient } from './client';\n\nfunction mapReason(reason: Reason): ResolutionReason {\n switch (reason) {\n case Reason.ERROR:\n return StandardResolutionReasons.ERROR;\n case Reason.PAUSED:\n return StandardResolutionReasons.STATIC;\n case Reason.FALLTHROUGH:\n return StandardResolutionReasons.DEFAULT;\n case Reason.TARGET_MATCH:\n case Reason.RULE_MATCH:\n return StandardResolutionReasons.TARGETING_MATCH;\n default:\n return StandardResolutionReasons.UNKNOWN;\n }\n}\n\nexport class VercelProvider implements Provider {\n readonly metadata: ProviderMetadata = {\n name: 'vercel-nodejs-provider',\n } as const;\n\n readonly runsOn = 'server';\n private client: FlagsClient;\n\n /**\n * Creates a VercelProvider from an existing FlagsClient\n */\n constructor(client: FlagsClient);\n /**\n * Creates a VercelProvider from a connection string\n */\n constructor(connectionString: string);\n constructor(clientOrConnectionString: FlagsClient | string) {\n if (typeof clientOrConnectionString === 'string') {\n this.client = createClientFromConnectionString(clientOrConnectionString);\n } else {\n this.client = clientOrConnectionString;\n }\n }\n\n async initialize(context?: EvaluationContext): Promise<void> {\n await this.client.initialize();\n }\n\n async onClose() {\n await this.client.shutdown();\n }\n\n async resolveBooleanEvaluation(\n flagKey: string,\n defaultValue: boolean,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<boolean>> {\n const result = await this.client.evaluate<boolean>(\n flagKey,\n defaultValue,\n context,\n );\n\n if (result.reason === Reason.ERROR) {\n return {\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n errorCode: ErrorCode.GENERAL,\n errorMessage: result.errorMessage,\n };\n }\n\n if (typeof result.value !== 'boolean') {\n return {\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n errorCode: ErrorCode.TYPE_MISMATCH,\n errorMessage: `Expected boolean value for flag \"${flagKey}\"`,\n };\n }\n\n return {\n value: result.value,\n reason: mapReason(result.reason),\n };\n }\n\n async resolveStringEvaluation(\n flagKey: string,\n defaultValue: string,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<string>> {\n const result = await this.client.evaluate<string>(\n flagKey,\n defaultValue,\n context,\n );\n\n if (result.reason === Reason.ERROR) {\n return {\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n errorCode: ErrorCode.GENERAL,\n errorMessage: result.errorMessage,\n };\n }\n\n if (typeof result.value !== 'string') {\n return {\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n errorCode: ErrorCode.TYPE_MISMATCH,\n errorMessage: `Expected string value for flag \"${flagKey}\"`,\n };\n }\n\n return {\n value: result.value,\n reason: mapReason(result.reason),\n errorMessage: result.errorMessage,\n };\n }\n\n async resolveNumberEvaluation(\n flagKey: string,\n defaultValue: number,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<number>> {\n const result = await this.client.evaluate<number>(\n flagKey,\n defaultValue,\n context,\n );\n\n if (result.reason === Reason.ERROR) {\n return {\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n errorCode: ErrorCode.GENERAL,\n errorMessage: result.errorMessage,\n };\n }\n\n if (typeof result.value !== 'number') {\n return {\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n errorCode: ErrorCode.TYPE_MISMATCH,\n errorMessage: `Expected number value for flag \"${flagKey}\"`,\n };\n }\n\n return {\n value: result.value,\n reason: mapReason(result.reason),\n errorMessage: result.errorMessage,\n };\n }\n\n async resolveObjectEvaluation<T extends JsonValue>(\n flagKey: string,\n defaultValue: T,\n context: EvaluationContext,\n ): Promise<ResolutionDetails<T>> {\n const result = await this.client.evaluate<T>(\n flagKey,\n defaultValue,\n context,\n );\n\n if (result.reason === Reason.ERROR) {\n return {\n value: defaultValue,\n reason: StandardResolutionReasons.ERROR,\n errorCode: ErrorCode.GENERAL,\n errorMessage: result.errorMessage,\n };\n }\n\n return {\n value: result.value,\n reason: mapReason(result.reason),\n errorMessage: result.errorMessage,\n };\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vercel/flags-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"keywords": [],
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "",
|
|
8
|
+
"sideEffects": false,
|
|
9
|
+
"type": "module",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": "./dist/index.js",
|
|
12
|
+
"./openfeature": "./dist/openfeature.js"
|
|
13
|
+
},
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"typesVersions": {
|
|
16
|
+
"*": {
|
|
17
|
+
".": [
|
|
18
|
+
"dist/*.d.ts"
|
|
19
|
+
],
|
|
20
|
+
"./openfeature": [
|
|
21
|
+
"dist/openfeature.d.ts"
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"CHANGELOG.md"
|
|
28
|
+
],
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"jose": "5.2.1",
|
|
31
|
+
"js-xxhash": "4.0.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/node": "20.11.17",
|
|
35
|
+
"@vercel/edge-config": "1.4.0",
|
|
36
|
+
"msw": "2.6.4",
|
|
37
|
+
"tsup": "8.0.1",
|
|
38
|
+
"typescript": "5.6.3",
|
|
39
|
+
"vite": "6.0.3",
|
|
40
|
+
"vitest": "2.1.8",
|
|
41
|
+
"flags": "4.0.1",
|
|
42
|
+
"tsconfig": "0.0.0"
|
|
43
|
+
},
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"@vercel/edge-config": "^1.2.0",
|
|
46
|
+
"flags": "*",
|
|
47
|
+
"@openfeature/server-sdk": "1.18.0"
|
|
48
|
+
},
|
|
49
|
+
"peerDependenciesMeta": {
|
|
50
|
+
"@openfeature/server-sdk": {
|
|
51
|
+
"optional": true
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"publishConfig": {
|
|
55
|
+
"access": "public"
|
|
56
|
+
},
|
|
57
|
+
"scripts": {
|
|
58
|
+
"build": "tsup",
|
|
59
|
+
"dev": "tsup --watch",
|
|
60
|
+
"check": "biome check",
|
|
61
|
+
"test": "vitest --run",
|
|
62
|
+
"test:watch": "vitest",
|
|
63
|
+
"type-check": "tsc --noEmit"
|
|
64
|
+
}
|
|
65
|
+
}
|