@nexusts/feature-flag 0.9.7 → 0.9.9
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/index.js +2 -9
- package/dist/index.js.map +2 -2
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -9,10 +9,6 @@ var __legacyDecorateClassTS = function(decorators, target, key, desc) {
|
|
|
9
9
|
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
10
10
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
11
11
|
};
|
|
12
|
-
var __legacyMetadataTS = (k, v) => {
|
|
13
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
14
|
-
return Reflect.metadata(k, v);
|
|
15
|
-
};
|
|
16
12
|
|
|
17
13
|
// packages/feature-flag/src/feature-flag.module.ts
|
|
18
14
|
import { Module } from "@nexusts/core";
|
|
@@ -150,10 +146,7 @@ __legacyDecorateClassTS([
|
|
|
150
146
|
Inject("FEATURE_FLAG_CONFIG")
|
|
151
147
|
], FeatureFlagService.prototype, "_config", undefined);
|
|
152
148
|
FeatureFlagService = __legacyDecorateClassTS([
|
|
153
|
-
Injectable()
|
|
154
|
-
__legacyMetadataTS("design:paramtypes", [
|
|
155
|
-
typeof FeatureFlagConfig === "undefined" ? Object : FeatureFlagConfig
|
|
156
|
-
])
|
|
149
|
+
Injectable()
|
|
157
150
|
], FeatureFlagService);
|
|
158
151
|
|
|
159
152
|
// packages/feature-flag/src/feature-flag.module.ts
|
|
@@ -194,5 +187,5 @@ export {
|
|
|
194
187
|
FeatureFlag
|
|
195
188
|
};
|
|
196
189
|
|
|
197
|
-
//# debugId=
|
|
190
|
+
//# debugId=26033F41BE21033364756E2164756E21
|
|
198
191
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"import type { FlagContext, FlagDefinition, FeatureFlagBackend } from \"../types.js\";\n\n/** djb2 hash → deterministic 0-1 float for rollout bucketing. */\nfunction hashFloat(s: string): number {\n\tlet h = 5381;\n\tfor (let i = 0; i < s.length; i++) {\n\t\th = Math.imul(h, 33) ^ s.charCodeAt(i);\n\t}\n\treturn (h >>> 0) / 0xffffffff;\n}\n\n/** In-process feature flag backend — no external dependencies. */\nexport class MemoryFlagBackend implements FeatureFlagBackend {\n\t#flags = new Map<string, FlagDefinition>();\n\n\tconstructor(initial: Record<string, FlagDefinition | boolean> = {}) {\n\t\tfor (const [k, v] of Object.entries(initial)) {\n\t\t\tthis.#flags.set(k, typeof v === \"boolean\" ? { enabled: v } : v);\n\t\t}\n\t}\n\n\tsetFlag(flagName: string, definition: FlagDefinition | boolean): void {\n\t\tthis.#flags.set(\n\t\t\tflagName,\n\t\t\ttypeof definition === \"boolean\" ? { enabled: definition } : definition,\n\t\t);\n\t}\n\n\tgetFlag(flagName: string): FlagDefinition | undefined {\n\t\treturn this.#flags.get(flagName);\n\t}\n\n\tasync isEnabled(flagName: string, context?: FlagContext): Promise<boolean> {\n\t\tconst def = this.#flags.get(flagName);\n\t\tif (!def) return false;\n\n\t\tconst id = context?.userId ?? context?.tenantId ?? context?.key ?? \"\";\n\n\t\t// Denylist has highest priority\n\t\tif (id && def.denylist?.includes(id)) return false;\n\n\t\t// Allowlist always wins after denylist\n\t\tif (id && def.allowlist?.includes(id)) return true;\n\n\t\t// Base enabled gate\n\t\tif (def.enabled === false) return false;\n\n\t\t// Rollout: deterministic hash bucketing\n\t\tif (def.rollout !== undefined && def.rollout < 1) {\n\t\t\tif (!id) return def.rollout > 0;\n\t\t\treturn hashFloat(`${flagName}:${id}`) < def.rollout;\n\t\t}\n\n\t\treturn def.enabled ?? true;\n\t}\n}\n",
|
|
8
8
|
"/**\n * `@FeatureFlag('flag-name')` — gate a route behind a feature flag.\n *\n * Dual-mode: supports TC39 standard ES decorators + legacy.\n */\nimport type { FlagContext } from \"../types.js\";\nimport { safeGetMeta, safeDefineMeta } from \"@nexusts/core/di/safe-reflect\";\n\nconst FLAG_META = Symbol.for(\"nexus:FeatureFlag\");\nconst FN_KEY = Symbol.for(\"nexus:ff:fn:meta\");\n\nexport interface FeatureFlagOptions {\n\tcontextFn?: (c: any) => FlagContext;\n\tonDisabled?: (c: any) => Response | Promise<Response>;\n}\n\nexport interface FlagSpec {\n\tpropertyKey: string | symbol;\n\tflagName: string;\n\tcontextFn?: (c: any) => FlagContext;\n\tonDisabled?: (c: any) => Response | Promise<Response>;\n\toriginal: (...args: any[]) => any;\n}\n\nexport function FeatureFlag(flagName: string, options: FeatureFlagOptions = {}): any {\n\treturn function (this: any, targetOrFn: any, contextOrKey?: any): void {\n\t\tif (contextOrKey?.kind === \"method\") {\n\t\t\tconst fn = targetOrFn;\n\t\t\tconst { name, metadata } = contextOrKey;\n\t\t\tconst spec: FlagSpec = { propertyKey: name, flagName, contextFn: options.contextFn, onDisabled: options.onDisabled, original: fn };\n\t\t\tconst existing: FlagSpec[] = (metadata[FLAG_META] as FlagSpec[]) ?? [];\n\t\t\texisting.push(spec);\n\t\t\tmetadata[FLAG_META] = existing;\n\t\t\t// Also stash on the function for legacy reader access.\n\t\t\tif (!(fn as any)[FN_KEY]) (fn as any)[FN_KEY] = [];\n\t\t\t(fn as any)[FN_KEY].push(spec);\n\t\t\treturn;\n\t\t}\n\t\tconst target = targetOrFn;\n\t\tconst propertyKey = contextOrKey as string | symbol;\n\t\tconst descriptor = arguments[2];\n\t\tconst specs: FlagSpec[] = safeGetMeta(FLAG_META, target.constructor) ?? [];\n\t\tspecs.push({\n\t\t\tpropertyKey,\n\t\t\tflagName,\n\t\t\tcontextFn: options.contextFn,\n\t\t\tonDisabled: options.onDisabled,\n\t\t\toriginal: descriptor?.value,\n\t\t});\n\t\tsafeDefineMeta(FLAG_META, specs, target.constructor);\n\t};\n}\n\nexport function getFlagSpecs(target: any): FlagSpec[] {\n\t// Legacy path\n\tconst fromLegacy = safeGetMeta(FLAG_META, target) as FlagSpec[] | undefined;\n\tif (fromLegacy) return fromLegacy;\n\t// Standard path: collect from prototype functions\n\tconst result: FlagSpec[] = [];\n\tif (target?.prototype) {\n\t\tfor (const key of Object.getOwnPropertyNames(target.prototype)) {\n\t\t\tconst fn = target.prototype[key];\n\t\t\tif (typeof fn === \"function\") {\n\t\t\t\tconst stashed = (fn as any)[FN_KEY];\n\t\t\t\tif (Array.isArray(stashed)) result.push(...stashed);\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "26033F41BE21033364756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexusts/feature-flag",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.9",
|
|
4
4
|
"description": "Feature flags, canary deployments, and A/B testing for NexusTS",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
],
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@nexusts/core": "^0.9.
|
|
32
|
+
"@nexusts/core": "^0.9.9"
|
|
33
33
|
},
|
|
34
34
|
"repository": {
|
|
35
35
|
"type": "git",
|