digital-products 2.1.3 → 2.4.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/.turbo/turbo-build.log +4 -5
- package/CHANGELOG.md +17 -0
- package/README.md +2 -0
- package/dist/api.js +7 -7
- package/dist/api.js.map +1 -1
- package/dist/app.js +6 -6
- package/dist/app.js.map +1 -1
- package/dist/client.d.ts +157 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +69 -0
- package/dist/client.js.map +1 -0
- package/dist/content.js +7 -7
- package/dist/content.js.map +1 -1
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +6 -6
- package/dist/data.js.map +1 -1
- package/dist/dataset.js +5 -5
- package/dist/dataset.js.map +1 -1
- package/dist/index.d.ts +92 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +139 -15
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +17 -10
- package/dist/mcp.js.map +1 -1
- package/dist/product.js +2 -2
- package/dist/product.js.map +1 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +52 -16
- package/dist/sdk.js.map +1 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +12 -8
- package/dist/site.js.map +1 -1
- package/dist/types.d.ts +830 -12
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +495 -2
- package/dist/types.js.map +1 -1
- package/dist/worker.d.ts +205 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +356 -0
- package/dist/worker.js.map +1 -0
- package/package.json +29 -13
- package/src/api.ts +7 -7
- package/src/app.ts +6 -6
- package/src/client.ts +192 -0
- package/src/content.ts +7 -7
- package/src/data.ts +12 -7
- package/src/dataset.ts +5 -5
- package/src/index.ts +151 -15
- package/src/mcp.ts +18 -11
- package/src/product.ts +2 -2
- package/src/sdk.ts +54 -15
- package/src/site.ts +12 -8
- package/src/types.ts +821 -12
- package/src/worker.ts +525 -0
- package/test/product.test.ts +53 -198
- package/test/unified-types.test.ts +589 -0
- package/test/worker.test.ts +912 -0
- package/vitest.config.ts +42 -0
- package/wrangler.jsonc +36 -0
- package/LICENSE +0 -21
- package/dist/features/define.d.ts +0 -63
- package/dist/features/define.d.ts.map +0 -1
- package/dist/features/define.js +0 -72
- package/dist/features/define.js.map +0 -1
- package/dist/features/flags.d.ts +0 -98
- package/dist/features/flags.d.ts.map +0 -1
- package/dist/features/flags.js +0 -145
- package/dist/features/flags.js.map +0 -1
- package/dist/features/toggles.d.ts +0 -75
- package/dist/features/toggles.d.ts.map +0 -1
- package/dist/features/toggles.js +0 -107
- package/dist/features/toggles.js.map +0 -1
- package/dist/tiers/define.d.ts +0 -63
- package/dist/tiers/define.d.ts.map +0 -1
- package/dist/tiers/define.js +0 -78
- package/dist/tiers/define.js.map +0 -1
- package/dist/tiers/entitlements.d.ts +0 -94
- package/dist/tiers/entitlements.d.ts.map +0 -1
- package/dist/tiers/entitlements.js +0 -94
- package/dist/tiers/entitlements.js.map +0 -1
- package/src/api.js +0 -128
- package/src/app.js +0 -106
- package/src/content.js +0 -77
- package/src/data.js +0 -106
- package/src/dataset.js +0 -49
- package/src/entities/ai.js +0 -858
- package/src/entities/content.js +0 -783
- package/src/entities/index.js +0 -88
- package/src/entities/interfaces.js +0 -929
- package/src/entities/lifecycle.js +0 -803
- package/src/entities/products.js +0 -797
- package/src/entities/web.js +0 -657
- package/src/features/define.ts +0 -130
- package/src/features/flags.ts +0 -247
- package/src/features/toggles.ts +0 -189
- package/src/index.js +0 -35
- package/src/mcp.js +0 -139
- package/src/pricing/billing.ts +0 -386
- package/src/pricing/plans.ts +0 -214
- package/src/product.js +0 -53
- package/src/registry.js +0 -31
- package/src/sdk.js +0 -127
- package/src/site.js +0 -112
- package/src/tiers/define.ts +0 -137
- package/src/tiers/entitlements.ts +0 -201
- package/src/types.js +0 -4
- package/test/analytics/events.test.ts +0 -319
- package/test/analytics/experiments.test.ts +0 -327
- package/test/features/define.test.ts +0 -187
- package/test/features/flags.test.ts +0 -259
- package/test/features/toggles.test.ts +0 -178
- package/test/lifecycle/stages.test.ts +0 -233
- package/test/lifecycle/transitions.test.ts +0 -207
- package/test/onboarding/flows.test.ts +0 -307
- package/test/pricing/billing.test.ts +0 -287
- package/test/pricing/plans.test.ts +0 -307
- package/test/roadmap/milestones.test.ts +0 -231
- package/test/roadmap/priorities.test.ts +0 -239
- package/test/tiers/define.test.ts +0 -192
- package/test/tiers/entitlements.test.ts +0 -220
package/vitest.config.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { defineWorkersConfig } from '@cloudflare/vitest-pool-workers/config'
|
|
2
|
+
|
|
3
|
+
export default defineWorkersConfig({
|
|
4
|
+
test: {
|
|
5
|
+
// CRITICAL: Limit concurrency to prevent resource exhaustion
|
|
6
|
+
maxConcurrency: 1,
|
|
7
|
+
maxWorkers: 1,
|
|
8
|
+
minWorkers: 1,
|
|
9
|
+
fileParallelism: false,
|
|
10
|
+
|
|
11
|
+
poolOptions: {
|
|
12
|
+
workers: {
|
|
13
|
+
wrangler: { configPath: './wrangler.jsonc' },
|
|
14
|
+
miniflare: {
|
|
15
|
+
compatibilityDate: '2025-01-20',
|
|
16
|
+
compatibilityFlags: ['nodejs_compat_v2'],
|
|
17
|
+
durableObjects: {
|
|
18
|
+
PRODUCT_CATALOG: 'ProductCatalog',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
include: ['src/**/*.test.ts', 'test/**/*.test.ts'],
|
|
25
|
+
testTimeout: 60000, // AI calls can take time
|
|
26
|
+
hookTimeout: 30000,
|
|
27
|
+
|
|
28
|
+
// Coverage configuration
|
|
29
|
+
coverage: {
|
|
30
|
+
provider: 'v8',
|
|
31
|
+
reporter: ['text', 'json', 'html'],
|
|
32
|
+
include: ['src/**/*.ts'],
|
|
33
|
+
exclude: ['**/*.test.ts', '**/__tests__/**', '**/node_modules/**'],
|
|
34
|
+
thresholds: {
|
|
35
|
+
statements: 65,
|
|
36
|
+
branches: 60,
|
|
37
|
+
functions: 60,
|
|
38
|
+
lines: 65,
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
})
|
package/wrangler.jsonc
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Wrangler configuration for digital-products worker tests
|
|
3
|
+
// Used by @cloudflare/vitest-pool-workers for testing
|
|
4
|
+
|
|
5
|
+
"name": "digital-products",
|
|
6
|
+
"main": "src/worker.ts",
|
|
7
|
+
"compatibility_date": "2025-01-20",
|
|
8
|
+
"compatibility_flags": ["nodejs_compat_v2"],
|
|
9
|
+
|
|
10
|
+
// AI binding for Cloudflare Workers AI
|
|
11
|
+
// Enables real AI Gateway access in tests (cache: true for deterministic tests)
|
|
12
|
+
"ai": {
|
|
13
|
+
"binding": "AI"
|
|
14
|
+
},
|
|
15
|
+
|
|
16
|
+
// Durable Objects for product catalog persistence
|
|
17
|
+
"durable_objects": {
|
|
18
|
+
"bindings": [
|
|
19
|
+
{ "name": "PRODUCT_CATALOG", "class_name": "ProductCatalog" }
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
// Migrations for Durable Objects
|
|
24
|
+
"migrations": [
|
|
25
|
+
{ "tag": "v1", "new_classes": ["ProductCatalog"] }
|
|
26
|
+
],
|
|
27
|
+
|
|
28
|
+
// The default export (ProductService) extends WorkerEntrypoint
|
|
29
|
+
// All public methods are automatically exposed via RPC
|
|
30
|
+
|
|
31
|
+
// Environment variables for AI Gateway
|
|
32
|
+
// These are loaded from .dev.vars or .env in local development
|
|
33
|
+
"vars": {
|
|
34
|
+
// Placeholder - actual values come from .dev.vars
|
|
35
|
+
}
|
|
36
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 .org.ai
|
|
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.
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Feature Definition
|
|
3
|
-
* Primitives for defining product features
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Feature status options
|
|
7
|
-
*/
|
|
8
|
-
export type FeatureStatus = 'active' | 'beta' | 'deprecated' | 'disabled';
|
|
9
|
-
/**
|
|
10
|
-
* Feature definition
|
|
11
|
-
*/
|
|
12
|
-
export interface FeatureDefinition {
|
|
13
|
-
/** Unique identifier */
|
|
14
|
-
id: string;
|
|
15
|
-
/** Human-readable name */
|
|
16
|
-
name: string;
|
|
17
|
-
/** Description of the feature */
|
|
18
|
-
description: string;
|
|
19
|
-
/** Feature category */
|
|
20
|
-
category?: string;
|
|
21
|
-
/** Dependencies on other features */
|
|
22
|
-
dependencies?: string[];
|
|
23
|
-
/** Metadata */
|
|
24
|
-
metadata?: Record<string, unknown>;
|
|
25
|
-
/** Feature status */
|
|
26
|
-
status?: FeatureStatus;
|
|
27
|
-
/** Version */
|
|
28
|
-
version?: string;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Create a feature definition
|
|
32
|
-
*/
|
|
33
|
-
export declare function Feature(config: Omit<FeatureDefinition, 'status'> & {
|
|
34
|
-
status?: FeatureStatus;
|
|
35
|
-
}): FeatureDefinition;
|
|
36
|
-
/**
|
|
37
|
-
* Create and validate a feature definition
|
|
38
|
-
*/
|
|
39
|
-
export declare function defineFeature(config: Omit<FeatureDefinition, 'status'> & {
|
|
40
|
-
status?: FeatureStatus;
|
|
41
|
-
}): FeatureDefinition;
|
|
42
|
-
/**
|
|
43
|
-
* Feature registry interface
|
|
44
|
-
*/
|
|
45
|
-
export interface FeatureRegistry {
|
|
46
|
-
/** Register a feature */
|
|
47
|
-
register(feature: FeatureDefinition): void;
|
|
48
|
-
/** Get a feature by ID */
|
|
49
|
-
get(id: string): FeatureDefinition | undefined;
|
|
50
|
-
/** List all features */
|
|
51
|
-
list(): FeatureDefinition[];
|
|
52
|
-
/** List features by category */
|
|
53
|
-
listByCategory(category: string): FeatureDefinition[];
|
|
54
|
-
/** Get dependency graph for a feature */
|
|
55
|
-
getDependencyGraph(featureId: string): string[];
|
|
56
|
-
/** Clear registry */
|
|
57
|
-
clear(): void;
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Create a feature registry
|
|
61
|
-
*/
|
|
62
|
-
export declare function createFeatureRegistry(): FeatureRegistry;
|
|
63
|
-
//# sourceMappingURL=define.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/features/define.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,CAAA;AAEzE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAA;IACnB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,qCAAqC;IACrC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAClC,qBAAqB;IACrB,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,cAAc;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,GAAG,iBAAiB,CAWjH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG;IAAE,MAAM,CAAC,EAAE,aAAa,CAAA;CAAE,GACrE,iBAAiB,CAMnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC1C,0BAA0B;IAC1B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAAA;IAC9C,wBAAwB;IACxB,IAAI,IAAI,iBAAiB,EAAE,CAAA;IAC3B,gCAAgC;IAChC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAAA;IACrD,yCAAyC;IACzC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC/C,qBAAqB;IACrB,KAAK,IAAI,IAAI,CAAA;CACd;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,eAAe,CA+CvD"}
|
package/dist/features/define.js
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Feature Definition
|
|
3
|
-
* Primitives for defining product features
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Create a feature definition
|
|
7
|
-
*/
|
|
8
|
-
export function Feature(config) {
|
|
9
|
-
return {
|
|
10
|
-
id: config.id,
|
|
11
|
-
name: config.name,
|
|
12
|
-
description: config.description,
|
|
13
|
-
category: config.category,
|
|
14
|
-
dependencies: config.dependencies,
|
|
15
|
-
metadata: config.metadata,
|
|
16
|
-
status: config.status ?? 'active',
|
|
17
|
-
version: config.version,
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Create and validate a feature definition
|
|
22
|
-
*/
|
|
23
|
-
export function defineFeature(config) {
|
|
24
|
-
if (!config.id || config.id.trim() === '') {
|
|
25
|
-
throw new Error('Feature ID is required');
|
|
26
|
-
}
|
|
27
|
-
return Feature(config);
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Create a feature registry
|
|
31
|
-
*/
|
|
32
|
-
export function createFeatureRegistry() {
|
|
33
|
-
const features = new Map();
|
|
34
|
-
return {
|
|
35
|
-
register(feature) {
|
|
36
|
-
features.set(feature.id, feature);
|
|
37
|
-
},
|
|
38
|
-
get(id) {
|
|
39
|
-
return features.get(id);
|
|
40
|
-
},
|
|
41
|
-
list() {
|
|
42
|
-
return Array.from(features.values());
|
|
43
|
-
},
|
|
44
|
-
listByCategory(category) {
|
|
45
|
-
return Array.from(features.values()).filter((f) => f.category === category);
|
|
46
|
-
},
|
|
47
|
-
getDependencyGraph(featureId) {
|
|
48
|
-
const result = [];
|
|
49
|
-
const visited = new Set();
|
|
50
|
-
const traverse = (id) => {
|
|
51
|
-
if (visited.has(id))
|
|
52
|
-
return;
|
|
53
|
-
visited.add(id);
|
|
54
|
-
const feature = features.get(id);
|
|
55
|
-
if (feature?.dependencies) {
|
|
56
|
-
for (const depId of feature.dependencies) {
|
|
57
|
-
traverse(depId);
|
|
58
|
-
if (!result.includes(depId)) {
|
|
59
|
-
result.push(depId);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
traverse(featureId);
|
|
65
|
-
return result;
|
|
66
|
-
},
|
|
67
|
-
clear() {
|
|
68
|
-
features.clear();
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
//# sourceMappingURL=define.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/features/define.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA6BH;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAsE;IAC5F,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,QAAQ;QACjC,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAsE;IAEtE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC3C,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,CAAA;AACxB,CAAC;AAoBD;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA6B,CAAA;IAErD,OAAO;QACL,QAAQ,CAAC,OAA0B;YACjC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QACnC,CAAC;QAED,GAAG,CAAC,EAAU;YACZ,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACzB,CAAC;QAED,IAAI;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QACtC,CAAC;QAED,cAAc,CAAC,QAAgB;YAC7B,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAA;QAC7E,CAAC;QAED,kBAAkB,CAAC,SAAiB;YAClC,MAAM,MAAM,GAAa,EAAE,CAAA;YAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAA;YAEjC,MAAM,QAAQ,GAAG,CAAC,EAAU,EAAE,EAAE;gBAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAE,OAAM;gBAC3B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAEf,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAChC,IAAI,OAAO,EAAE,YAAY,EAAE,CAAC;oBAC1B,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;wBACzC,QAAQ,CAAC,KAAK,CAAC,CAAA;wBACf,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;4BAC5B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;wBACpB,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC,CAAA;YAED,QAAQ,CAAC,SAAS,CAAC,CAAA;YACnB,OAAO,MAAM,CAAA;QACf,CAAC;QAED,KAAK;YACH,QAAQ,CAAC,KAAK,EAAE,CAAA;QAClB,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/features/flags.d.ts
DELETED
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Feature Flags
|
|
3
|
-
* Runtime feature flag system
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Flag value types
|
|
7
|
-
*/
|
|
8
|
-
export type FlagType = 'boolean' | 'string' | 'number' | 'json';
|
|
9
|
-
/**
|
|
10
|
-
* Targeting condition
|
|
11
|
-
*/
|
|
12
|
-
export interface TargetingCondition {
|
|
13
|
-
attribute: string;
|
|
14
|
-
operator: 'equals' | 'not_equals' | 'in' | 'not_in' | 'gt' | 'lt' | 'gte' | 'lte' | 'contains';
|
|
15
|
-
value: unknown;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Targeting rule
|
|
19
|
-
*/
|
|
20
|
-
export interface TargetingRule {
|
|
21
|
-
condition: TargetingCondition;
|
|
22
|
-
value: unknown;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Feature flag definition
|
|
26
|
-
*/
|
|
27
|
-
export interface FeatureFlagDefinition {
|
|
28
|
-
/** Unique key */
|
|
29
|
-
key: string;
|
|
30
|
-
/** Human-readable name */
|
|
31
|
-
name: string;
|
|
32
|
-
/** Flag type */
|
|
33
|
-
type: FlagType;
|
|
34
|
-
/** Default value */
|
|
35
|
-
defaultValue: unknown;
|
|
36
|
-
/** Allowed variants (for string type) */
|
|
37
|
-
variants?: string[];
|
|
38
|
-
/** Min value (for number type) */
|
|
39
|
-
min?: number;
|
|
40
|
-
/** Max value (for number type) */
|
|
41
|
-
max?: number;
|
|
42
|
-
/** Targeting rules */
|
|
43
|
-
rules?: TargetingRule[];
|
|
44
|
-
/** Rollout percentage (0-100) */
|
|
45
|
-
rolloutPercentage?: number;
|
|
46
|
-
/** Description */
|
|
47
|
-
description?: string;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Create a feature flag
|
|
51
|
-
*/
|
|
52
|
-
export declare function FeatureFlag(config: FeatureFlagDefinition): FeatureFlagDefinition;
|
|
53
|
-
/**
|
|
54
|
-
* Create a feature flag (alias)
|
|
55
|
-
*/
|
|
56
|
-
export declare const createFeatureFlag: typeof FeatureFlag;
|
|
57
|
-
/**
|
|
58
|
-
* Evaluation context for flag evaluation
|
|
59
|
-
*/
|
|
60
|
-
export interface FlagEvaluationContext {
|
|
61
|
-
userId?: string;
|
|
62
|
-
sessionId?: string;
|
|
63
|
-
attributes?: Record<string, unknown>;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Evaluation stats
|
|
67
|
-
*/
|
|
68
|
-
export interface EvaluationStats {
|
|
69
|
-
totalEvaluations: number;
|
|
70
|
-
trueCount: number;
|
|
71
|
-
falseCount: number;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Feature flag manager interface
|
|
75
|
-
*/
|
|
76
|
-
export interface FeatureFlagManager {
|
|
77
|
-
/** Register a flag */
|
|
78
|
-
register(flag: FeatureFlagDefinition): void;
|
|
79
|
-
/** Get a flag by key */
|
|
80
|
-
get(key: string): FeatureFlagDefinition | undefined;
|
|
81
|
-
/** Evaluate a flag */
|
|
82
|
-
evaluate(key: string, context: FlagEvaluationContext): unknown;
|
|
83
|
-
/** Get evaluation stats */
|
|
84
|
-
getEvaluationStats(key: string): EvaluationStats;
|
|
85
|
-
/** Set override for testing */
|
|
86
|
-
setOverride(key: string, value: unknown): void;
|
|
87
|
-
/** Clear override */
|
|
88
|
-
clearOverride(key: string): void;
|
|
89
|
-
/** List all flags */
|
|
90
|
-
list(): FeatureFlagDefinition[];
|
|
91
|
-
/** Remove a flag */
|
|
92
|
-
remove(key: string): void;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Create a feature flag manager
|
|
96
|
-
*/
|
|
97
|
-
export declare function createFeatureFlagManager(): FeatureFlagManager;
|
|
98
|
-
//# sourceMappingURL=flags.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/features/flags.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAA;AAE/D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAA;IAC9F,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,kBAAkB,CAAA;IAC7B,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,iBAAiB;IACjB,GAAG,EAAE,MAAM,CAAA;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,gBAAgB;IAChB,IAAI,EAAE,QAAQ,CAAA;IACd,oBAAoB;IACpB,YAAY,EAAE,OAAO,CAAA;IACrB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,sBAAsB;IACtB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;IACvB,iCAAiC;IACjC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,qBAAqB,GAAG,qBAAqB,CAahF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,oBAAc,CAAA;AAE5C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI,CAAA;IAC3C,wBAAwB;IACxB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAAA;IACnD,sBAAsB;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAA;IAC9D,2BAA2B;IAC3B,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAA;IAChD,+BAA+B;IAC/B,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9C,qBAAqB;IACrB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,qBAAqB;IACrB,IAAI,IAAI,qBAAqB,EAAE,CAAA;IAC/B,oBAAoB;IACpB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CA6H7D"}
|
package/dist/features/flags.js
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Feature Flags
|
|
3
|
-
* Runtime feature flag system
|
|
4
|
-
*/
|
|
5
|
-
import { createHash } from 'crypto';
|
|
6
|
-
/**
|
|
7
|
-
* Create a feature flag
|
|
8
|
-
*/
|
|
9
|
-
export function FeatureFlag(config) {
|
|
10
|
-
return {
|
|
11
|
-
key: config.key,
|
|
12
|
-
name: config.name,
|
|
13
|
-
type: config.type,
|
|
14
|
-
defaultValue: config.defaultValue,
|
|
15
|
-
variants: config.variants,
|
|
16
|
-
min: config.min,
|
|
17
|
-
max: config.max,
|
|
18
|
-
rules: config.rules,
|
|
19
|
-
rolloutPercentage: config.rolloutPercentage,
|
|
20
|
-
description: config.description,
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Create a feature flag (alias)
|
|
25
|
-
*/
|
|
26
|
-
export const createFeatureFlag = FeatureFlag;
|
|
27
|
-
/**
|
|
28
|
-
* Create a feature flag manager
|
|
29
|
-
*/
|
|
30
|
-
export function createFeatureFlagManager() {
|
|
31
|
-
const flags = new Map();
|
|
32
|
-
const overrides = new Map();
|
|
33
|
-
const stats = new Map();
|
|
34
|
-
const initStats = (key) => {
|
|
35
|
-
if (!stats.has(key)) {
|
|
36
|
-
stats.set(key, { totalEvaluations: 0, trueCount: 0, falseCount: 0 });
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
const evaluateCondition = (condition, context) => {
|
|
40
|
-
const attributeValue = context.attributes?.[condition.attribute];
|
|
41
|
-
switch (condition.operator) {
|
|
42
|
-
case 'equals':
|
|
43
|
-
return attributeValue === condition.value;
|
|
44
|
-
case 'not_equals':
|
|
45
|
-
return attributeValue !== condition.value;
|
|
46
|
-
case 'in':
|
|
47
|
-
return Array.isArray(condition.value) && condition.value.includes(attributeValue);
|
|
48
|
-
case 'not_in':
|
|
49
|
-
return Array.isArray(condition.value) && !condition.value.includes(attributeValue);
|
|
50
|
-
case 'gt':
|
|
51
|
-
return typeof attributeValue === 'number' && attributeValue > condition.value;
|
|
52
|
-
case 'lt':
|
|
53
|
-
return typeof attributeValue === 'number' && attributeValue < condition.value;
|
|
54
|
-
case 'gte':
|
|
55
|
-
return typeof attributeValue === 'number' && attributeValue >= condition.value;
|
|
56
|
-
case 'lte':
|
|
57
|
-
return typeof attributeValue === 'number' && attributeValue <= condition.value;
|
|
58
|
-
case 'contains':
|
|
59
|
-
return typeof attributeValue === 'string' && attributeValue.includes(condition.value);
|
|
60
|
-
default:
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
const hashUserToPercentage = (userId, key) => {
|
|
65
|
-
const hash = createHash('md5').update(`${userId}-${key}`).digest('hex');
|
|
66
|
-
const num = parseInt(hash.substring(0, 8), 16);
|
|
67
|
-
return (num % 100) + 1;
|
|
68
|
-
};
|
|
69
|
-
return {
|
|
70
|
-
register(flag) {
|
|
71
|
-
flags.set(flag.key, flag);
|
|
72
|
-
initStats(flag.key);
|
|
73
|
-
},
|
|
74
|
-
get(key) {
|
|
75
|
-
return flags.get(key);
|
|
76
|
-
},
|
|
77
|
-
evaluate(key, context) {
|
|
78
|
-
initStats(key);
|
|
79
|
-
const flagStats = stats.get(key);
|
|
80
|
-
flagStats.totalEvaluations++;
|
|
81
|
-
// Check for override first
|
|
82
|
-
if (overrides.has(key)) {
|
|
83
|
-
const value = overrides.get(key);
|
|
84
|
-
if (value === true)
|
|
85
|
-
flagStats.trueCount++;
|
|
86
|
-
else if (value === false)
|
|
87
|
-
flagStats.falseCount++;
|
|
88
|
-
return value;
|
|
89
|
-
}
|
|
90
|
-
const flag = flags.get(key);
|
|
91
|
-
if (!flag) {
|
|
92
|
-
return undefined;
|
|
93
|
-
}
|
|
94
|
-
// Check targeting rules
|
|
95
|
-
if (flag.rules) {
|
|
96
|
-
for (const rule of flag.rules) {
|
|
97
|
-
if (evaluateCondition(rule.condition, context)) {
|
|
98
|
-
const value = rule.value;
|
|
99
|
-
if (value === true)
|
|
100
|
-
flagStats.trueCount++;
|
|
101
|
-
else if (value === false)
|
|
102
|
-
flagStats.falseCount++;
|
|
103
|
-
return value;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// Check rollout percentage
|
|
108
|
-
if (flag.rolloutPercentage !== undefined && context.userId) {
|
|
109
|
-
const userPercentage = hashUserToPercentage(context.userId, key);
|
|
110
|
-
if (userPercentage <= flag.rolloutPercentage) {
|
|
111
|
-
if (flag.type === 'boolean') {
|
|
112
|
-
flagStats.trueCount++;
|
|
113
|
-
return true;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
// Return default value
|
|
118
|
-
const value = flag.defaultValue;
|
|
119
|
-
if (value === true)
|
|
120
|
-
flagStats.trueCount++;
|
|
121
|
-
else if (value === false)
|
|
122
|
-
flagStats.falseCount++;
|
|
123
|
-
return value;
|
|
124
|
-
},
|
|
125
|
-
getEvaluationStats(key) {
|
|
126
|
-
initStats(key);
|
|
127
|
-
return stats.get(key);
|
|
128
|
-
},
|
|
129
|
-
setOverride(key, value) {
|
|
130
|
-
overrides.set(key, value);
|
|
131
|
-
},
|
|
132
|
-
clearOverride(key) {
|
|
133
|
-
overrides.delete(key);
|
|
134
|
-
},
|
|
135
|
-
list() {
|
|
136
|
-
return Array.from(flags.values());
|
|
137
|
-
},
|
|
138
|
-
remove(key) {
|
|
139
|
-
flags.delete(key);
|
|
140
|
-
overrides.delete(key);
|
|
141
|
-
stats.delete(key);
|
|
142
|
-
},
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
//# sourceMappingURL=flags.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../../src/features/flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Feature Toggles
|
|
3
|
-
* Operational feature toggles for release management
|
|
4
|
-
*/
|
|
5
|
-
/**
|
|
6
|
-
* Toggle categories following Martin Fowler's feature toggle taxonomy
|
|
7
|
-
*/
|
|
8
|
-
export type ToggleCategory = 'ops' | 'release' | 'experiment' | 'permission';
|
|
9
|
-
/**
|
|
10
|
-
* Feature toggle definition
|
|
11
|
-
*/
|
|
12
|
-
export interface FeatureToggleDefinition {
|
|
13
|
-
/** Toggle name */
|
|
14
|
-
name: string;
|
|
15
|
-
/** Category */
|
|
16
|
-
category: ToggleCategory;
|
|
17
|
-
/** Whether toggle is enabled */
|
|
18
|
-
enabled: boolean;
|
|
19
|
-
/** Description */
|
|
20
|
-
description?: string;
|
|
21
|
-
/** Release date (for release toggles) */
|
|
22
|
-
releaseDate?: Date;
|
|
23
|
-
/** Experiment ID (for experiment toggles) */
|
|
24
|
-
experimentId?: string;
|
|
25
|
-
/** Required roles (for permission toggles) */
|
|
26
|
-
requiredRoles?: string[];
|
|
27
|
-
/** Expiration date */
|
|
28
|
-
expiresAt?: Date;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Create a feature toggle
|
|
32
|
-
*/
|
|
33
|
-
export declare function FeatureToggle(config: FeatureToggleDefinition): FeatureToggleDefinition;
|
|
34
|
-
/**
|
|
35
|
-
* Create a toggle (alias)
|
|
36
|
-
*/
|
|
37
|
-
export declare const createToggle: typeof FeatureToggle;
|
|
38
|
-
/**
|
|
39
|
-
* Toggle evaluation context
|
|
40
|
-
*/
|
|
41
|
-
export interface ToggleContext {
|
|
42
|
-
roles?: string[];
|
|
43
|
-
userId?: string;
|
|
44
|
-
attributes?: Record<string, unknown>;
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Toggle service interface
|
|
48
|
-
*/
|
|
49
|
-
export interface ToggleService {
|
|
50
|
-
/** Register a toggle */
|
|
51
|
-
register(toggle: FeatureToggleDefinition): void;
|
|
52
|
-
/** Check if toggle is enabled */
|
|
53
|
-
isEnabled(name: string, context?: ToggleContext): boolean;
|
|
54
|
-
/** Enable a toggle */
|
|
55
|
-
enable(name: string): void;
|
|
56
|
-
/** Disable a toggle */
|
|
57
|
-
disable(name: string): void;
|
|
58
|
-
/** List toggles by category */
|
|
59
|
-
listByCategory(category: ToggleCategory): FeatureToggleDefinition[];
|
|
60
|
-
/** Bulk enable toggles */
|
|
61
|
-
bulkEnable(names: string[]): void;
|
|
62
|
-
/** Bulk disable toggles */
|
|
63
|
-
bulkDisable(names: string[]): void;
|
|
64
|
-
/** Export toggle state */
|
|
65
|
-
export(): FeatureToggleDefinition[];
|
|
66
|
-
/** Import toggle state */
|
|
67
|
-
import(toggles: FeatureToggleDefinition[]): void;
|
|
68
|
-
/** Get toggle by name */
|
|
69
|
-
get(name: string): FeatureToggleDefinition | undefined;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Create a toggle service
|
|
73
|
-
*/
|
|
74
|
-
export declare function createToggleService(): ToggleService;
|
|
75
|
-
//# sourceMappingURL=toggles.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toggles.d.ts","sourceRoot":"","sources":["../../src/features/toggles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,CAAA;AAE5E;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,eAAe;IACf,QAAQ,EAAE,cAAc,CAAA;IACxB,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,yCAAyC;IACzC,WAAW,CAAC,EAAE,IAAI,CAAA;IAClB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,8CAA8C;IAC9C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;IACxB,sBAAsB;IACtB,SAAS,CAAC,EAAE,IAAI,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,uBAAuB,GAAG,uBAAuB,CAWtF;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,sBAAgB,CAAA;AAEzC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,QAAQ,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAA;IAC/C,iCAAiC;IACjC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAA;IACzD,sBAAsB;IACtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,uBAAuB;IACvB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,+BAA+B;IAC/B,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,uBAAuB,EAAE,CAAA;IACnE,0BAA0B;IAC1B,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IACjC,2BAA2B;IAC3B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAClC,0BAA0B;IAC1B,MAAM,IAAI,uBAAuB,EAAE,CAAA;IACnC,0BAA0B;IAC1B,MAAM,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,IAAI,CAAA;IAChD,yBAAyB;IACzB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAAA;CACvD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CAiGnD"}
|